aboutsummaryrefslogtreecommitdiff
path: root/csu
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2022-05-16 18:41:43 +0200
committerFlorian Weimer <fweimer@redhat.com>2022-05-16 18:42:03 +0200
commitf787e138aa0bf677bf74fa2a08595c446292f3d7 (patch)
tree8c9f9e876a6ae14ecd58dfd0628fa40018ae09a3 /csu
parentb57ab258c1140bc45464b4b9908713e3e0ee35aa (diff)
downloadglibc-f787e138aa0bf677bf74fa2a08595c446292f3d7.zip
glibc-f787e138aa0bf677bf74fa2a08595c446292f3d7.tar.gz
glibc-f787e138aa0bf677bf74fa2a08595c446292f3d7.tar.bz2
csu: Implement and use _dl_early_allocate during static startup
This implements mmap fallback for a brk failure during TLS allocation. scripts/tls-elf-edit.py is updated to support the new patching method. The script no longer requires that in the input object is of ET_DYN type. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'csu')
-rw-r--r--csu/libc-tls.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/csu/libc-tls.c b/csu/libc-tls.c
index bef92a7..0a216c5 100644
--- a/csu/libc-tls.c
+++ b/csu/libc-tls.c
@@ -145,11 +145,16 @@ __libc_setup_tls (void)
_dl_allocate_tls_storage (in elf/dl-tls.c) does using __libc_memalign
and dl_tls_static_align. */
tcb_offset = roundup (memsz + GLRO(dl_tls_static_surplus), max_align);
- tlsblock = __sbrk (tcb_offset + TLS_INIT_TCB_SIZE + max_align);
+ tlsblock = _dl_early_allocate (tcb_offset + TLS_INIT_TCB_SIZE + max_align);
+ if (tlsblock == NULL)
+ _startup_fatal ("Fatal glibc error: Cannot allocate TLS block\n");
#elif TLS_DTV_AT_TP
tcb_offset = roundup (TLS_INIT_TCB_SIZE, align ?: 1);
- tlsblock = __sbrk (tcb_offset + memsz + max_align
- + TLS_PRE_TCB_SIZE + GLRO(dl_tls_static_surplus));
+ tlsblock = _dl_early_allocate (tcb_offset + memsz + max_align
+ + TLS_PRE_TCB_SIZE
+ + GLRO(dl_tls_static_surplus));
+ if (tlsblock == NULL)
+ _startup_fatal ("Fatal glibc error: Cannot allocate TLS block\n");
tlsblock += TLS_PRE_TCB_SIZE;
#else
/* In case a model with a different layout for the TCB and DTV