From 8b5f58bc00493668ee27de4e82f1e8f3e42af028 Mon Sep 17 00:00:00 2001 From: Matt Taylor Date: Sun, 9 May 2021 20:22:45 +0100 Subject: [PATCH] options/rtdl: Permit TLS alignments greater than 16 bytes --- options/rtdl/generic/linker.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp index 69c5578d..eb2e447c 100644 --- a/options/rtdl/generic/linker.cpp +++ b/options/rtdl/generic/linker.cpp @@ -712,6 +712,8 @@ Tcb *allocateTcb() { auto td_buffer = getAllocator().allocate(td_size); memset(td_buffer, 0, td_size); + __ensure((reinterpret_cast(td_buffer) & (tlsMaxAlignment - 1)) == 0); + Tcb *tcb_ptr = nullptr; if constexpr (tlsAboveTp) { @@ -1047,8 +1049,6 @@ void Loader::_buildTlsMaps() { object->tlsIndex = runtimeTlsMap->indices.size(); runtimeTlsMap->indices.push_back(object); - __ensure((16 & (object->tlsAlignment - 1)) == 0); - object->tlsModel = TlsModel::initial; if constexpr (tlsAboveTp) { @@ -1097,7 +1097,6 @@ void Loader::_buildTlsMaps() { // There are some libraries (e.g. Mesa) that require static TLS even though // they expect to be dynamically loaded. if(object->haveStaticTls) { - __ensure((16 & (object->tlsAlignment - 1)) == 0); auto ptr = runtimeTlsMap->initialPtr + object->tlsSegmentSize; size_t misalign = ptr & (object->tlsAlignment - 1); if(misalign)