diff mbox series

[uclibc-ng-devel] nptl: use mmap to allocate initial TLS data for static PIE on noMMU

Message ID 20220906134003.1970270-1-jcmvbkbc@gmail.com
State Superseded
Headers show
Series [uclibc-ng-devel] nptl: use mmap to allocate initial TLS data for static PIE on noMMU | expand

Commit Message

Max Filippov Sept. 6, 2022, 1:40 p.m. UTC
Static PIE ELFs may be loaded on noMMU linux platforms with FDPIC
support, but they don't have adjustable brk, and thus cannot allocate
memory for the TLS. Use mmap instead of sbrk to allocate initial TLS
memory when building with static PIE support for noMMU.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
 libpthread/nptl/sysdeps/generic/libc-tls.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/libpthread/nptl/sysdeps/generic/libc-tls.c b/libpthread/nptl/sysdeps/generic/libc-tls.c
index d9c09fdd6667..374ba2a48620 100644
--- a/libpthread/nptl/sysdeps/generic/libc-tls.c
+++ b/libpthread/nptl/sysdeps/generic/libc-tls.c
@@ -169,10 +169,13 @@  __libc_setup_tls (size_t tcbsize, size_t tcbalign)
      for FDPIC MMU-less platforms:
      fs/binfmt_elf_fdpic.c: fix brk area overlap with stack on NOMMU
      https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/fs/binfmt_elf_fdpic.c?id=4ac313111018cb44ecc250445de5ccb93026a980
+     Loading static PIE ELFs is possible since linux kernel commit
+     1bde925d2354 ("fs/binfmt_elf_fdpic.c: provide NOMMU loader for regular ELF binaries")
+     and it is subject to the same brk restrixtion.
    */
 # if defined(TLS_TCB_AT_TP)
   tcb_offset = roundup (memsz + GL(dl_tls_static_size), tcbalign);
-#  if defined(__FDPIC__)
+#  if defined(__FDPIC__) || (!defined(__ARCH_USE_MMU__) && defined(STATIC_PIE))
   tlsblock = mmap (NULL, tcb_offset + tcbsize + max_align,
                    PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
 #  else
@@ -180,7 +183,7 @@  __libc_setup_tls (size_t tcbsize, size_t tcbalign)
 #  endif
 # elif defined(TLS_DTV_AT_TP)
   tcb_offset = roundup (tcbsize, align ?: 1);
-#  if defined(__FDPIC__)
+#  if defined(__FDPIC__) || (!defined(__ARCH_USE_MMU__) && defined(STATIC_PIE))
   tlsblock = mmap (NULL, tcb_offset + memsz + max_align + TLS_PRE_TCB_SIZE + GL(dl_tls_static_size),
                    PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
 #  else