You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
6.3 KiB
190 lines
6.3 KiB
Recreation of this upstream commit: |
|
|
|
commit 3d8c8bff798a15b6dc0ee94d24fc877db9706589 |
|
Author: Andreas Schwab <schwab@suse.de> |
|
Date: Tue Mar 25 11:55:52 2014 +0100 |
|
|
|
Remove last use of USE___THREAD |
|
|
|
This was done using unifdef -m -UUSE___THREAD elf/rtld.c, followed by a |
|
manual reindent. |
|
|
|
diff --git a/elf/rtld.c b/elf/rtld.c |
|
index b5a859ecff740705..e934ad38db39d343 100644 |
|
--- a/elf/rtld.c |
|
+++ b/elf/rtld.c |
|
@@ -382,19 +382,8 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) |
|
GL(dl_rtld_map).l_text_end = (ElfW(Addr)) _etext; |
|
/* Copy the TLS related data if necessary. */ |
|
#ifndef DONT_USE_BOOTSTRAP_MAP |
|
-# if USE___THREAD |
|
- assert (info->l.l_tls_modid != 0); |
|
- GL(dl_rtld_map).l_tls_blocksize = info->l.l_tls_blocksize; |
|
- GL(dl_rtld_map).l_tls_align = info->l.l_tls_align; |
|
- GL(dl_rtld_map).l_tls_firstbyte_offset = info->l.l_tls_firstbyte_offset; |
|
- GL(dl_rtld_map).l_tls_initimage_size = info->l.l_tls_initimage_size; |
|
- GL(dl_rtld_map).l_tls_initimage = info->l.l_tls_initimage; |
|
- GL(dl_rtld_map).l_tls_offset = info->l.l_tls_offset; |
|
- GL(dl_rtld_map).l_tls_modid = 1; |
|
-# else |
|
-# if NO_TLS_OFFSET != 0 |
|
+# if NO_TLS_OFFSET != 0 |
|
GL(dl_rtld_map).l_tls_offset = NO_TLS_OFFSET; |
|
-# endif |
|
# endif |
|
|
|
#endif |
|
@@ -476,9 +465,6 @@ _dl_start (void *arg) |
|
++cnt) |
|
bootstrap_map.l_info[cnt] = 0; |
|
# endif |
|
-# if USE___THREAD |
|
- bootstrap_map.l_tls_modid = 0; |
|
-# endif |
|
#endif |
|
|
|
/* Figure out the run-time load address of the dynamic linker itself. */ |
|
@@ -497,117 +483,6 @@ _dl_start (void *arg) |
|
to it. When we have something like GOTOFF relocs, we can use a plain |
|
reference to find the runtime address. Without that, we have to rely |
|
on the `l_addr' value, which is not the value we want when prelinked. */ |
|
-#if USE___THREAD |
|
- dtv_t initdtv[3]; |
|
- ElfW(Ehdr) *ehdr |
|
-# ifdef DONT_USE_BOOTSTRAP_MAP |
|
- = (ElfW(Ehdr) *) &_begin; |
|
-# else |
|
-# error This will not work with prelink. |
|
- = (ElfW(Ehdr) *) bootstrap_map.l_addr; |
|
-# endif |
|
- ElfW(Phdr) *phdr = (ElfW(Phdr) *) ((void *) ehdr + ehdr->e_phoff); |
|
- size_t cnt = ehdr->e_phnum; /* PT_TLS is usually the last phdr. */ |
|
- while (cnt-- > 0) |
|
- if (phdr[cnt].p_type == PT_TLS) |
|
- { |
|
- void *tlsblock; |
|
- size_t max_align = MAX (TLS_INIT_TCB_ALIGN, phdr[cnt].p_align); |
|
- char *p; |
|
- |
|
- bootstrap_map.l_tls_blocksize = phdr[cnt].p_memsz; |
|
- bootstrap_map.l_tls_align = phdr[cnt].p_align; |
|
- if (phdr[cnt].p_align == 0) |
|
- bootstrap_map.l_tls_firstbyte_offset = 0; |
|
- else |
|
- bootstrap_map.l_tls_firstbyte_offset = (phdr[cnt].p_vaddr |
|
- & (phdr[cnt].p_align - 1)); |
|
- assert (bootstrap_map.l_tls_blocksize != 0); |
|
- bootstrap_map.l_tls_initimage_size = phdr[cnt].p_filesz; |
|
- bootstrap_map.l_tls_initimage = (void *) (bootstrap_map.l_addr |
|
- + phdr[cnt].p_vaddr); |
|
- |
|
- /* We can now allocate the initial TLS block. This can happen |
|
- on the stack. We'll get the final memory later when we |
|
- know all about the various objects loaded at startup |
|
- time. */ |
|
-# if TLS_TCB_AT_TP |
|
- tlsblock = alloca (roundup (bootstrap_map.l_tls_blocksize, |
|
- TLS_INIT_TCB_ALIGN) |
|
- + TLS_INIT_TCB_SIZE |
|
- + max_align); |
|
-# elif TLS_DTV_AT_TP |
|
- tlsblock = alloca (roundup (TLS_INIT_TCB_SIZE, |
|
- bootstrap_map.l_tls_align) |
|
- + bootstrap_map.l_tls_blocksize |
|
- + max_align); |
|
-# else |
|
- /* In case a model with a different layout for the TCB and DTV |
|
- is defined add another #elif here and in the following #ifs. */ |
|
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" |
|
-# endif |
|
- /* Align the TLS block. */ |
|
- tlsblock = (void *) (((uintptr_t) tlsblock + max_align - 1) |
|
- & ~(max_align - 1)); |
|
- |
|
- /* Initialize the dtv. [0] is the length, [1] the generation |
|
- counter. */ |
|
- initdtv[0].counter = 1; |
|
- initdtv[1].counter = 0; |
|
- |
|
- /* Initialize the TLS block. */ |
|
-# if TLS_TCB_AT_TP |
|
- initdtv[2].pointer = tlsblock; |
|
-# elif TLS_DTV_AT_TP |
|
- bootstrap_map.l_tls_offset = roundup (TLS_INIT_TCB_SIZE, |
|
- bootstrap_map.l_tls_align); |
|
- initdtv[2].pointer = (char *) tlsblock + bootstrap_map.l_tls_offset; |
|
-# else |
|
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" |
|
-# endif |
|
- p = __mempcpy (initdtv[2].pointer, bootstrap_map.l_tls_initimage, |
|
- bootstrap_map.l_tls_initimage_size); |
|
-# ifdef HAVE_BUILTIN_MEMSET |
|
- __builtin_memset (p, '\0', (bootstrap_map.l_tls_blocksize |
|
- - bootstrap_map.l_tls_initimage_size)); |
|
-# else |
|
- { |
|
- size_t remaining = (bootstrap_map.l_tls_blocksize |
|
- - bootstrap_map.l_tls_initimage_size); |
|
- while (remaining-- > 0) |
|
- *p++ = '\0'; |
|
- } |
|
-# endif |
|
- |
|
- /* Install the pointer to the dtv. */ |
|
- |
|
- /* Initialize the thread pointer. */ |
|
-# if TLS_TCB_AT_TP |
|
- bootstrap_map.l_tls_offset |
|
- = roundup (bootstrap_map.l_tls_blocksize, TLS_INIT_TCB_ALIGN); |
|
- |
|
- INSTALL_DTV ((char *) tlsblock + bootstrap_map.l_tls_offset, |
|
- initdtv); |
|
- |
|
- const char *lossage = TLS_INIT_TP ((char *) tlsblock |
|
- + bootstrap_map.l_tls_offset, 0); |
|
-# elif TLS_DTV_AT_TP |
|
- INSTALL_DTV (tlsblock, initdtv); |
|
- const char *lossage = TLS_INIT_TP (tlsblock, 0); |
|
-# else |
|
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" |
|
-# endif |
|
- if (__builtin_expect (lossage != NULL, 0)) |
|
- _dl_fatal_printf ("cannot set up thread-local storage: %s\n", |
|
- lossage); |
|
- |
|
- /* So far this is module number one. */ |
|
- bootstrap_map.l_tls_modid = 1; |
|
- |
|
- /* There can only be one PT_TLS entry. */ |
|
- break; |
|
- } |
|
-#endif /* USE___THREAD */ |
|
|
|
#ifdef ELF_MACHINE_BEFORE_RTLD_RELOC |
|
ELF_MACHINE_BEFORE_RTLD_RELOC (bootstrap_map.l_info); |
|
@@ -853,12 +728,7 @@ cannot allocate TLS data structures for initial thread"); |
|
|
|
/* And finally install it for the main thread. If ld.so itself uses |
|
TLS we know the thread pointer was initialized earlier. */ |
|
- const char *lossage |
|
-#ifdef USE___THREAD |
|
- = TLS_INIT_TP (tcbp, USE___THREAD); |
|
-#else |
|
- = TLS_INIT_TP (tcbp, 0); |
|
-#endif |
|
+ const char *lossage = TLS_INIT_TP (tcbp, 0); |
|
if (__builtin_expect (lossage != NULL, 0)) |
|
_dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage); |
|
tls_init_tp_called = true; |
|
@@ -2344,11 +2214,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", |
|
if (! tls_init_tp_called) |
|
{ |
|
const char *lossage |
|
-#ifdef USE___THREAD |
|
- = TLS_INIT_TP (tcbp, USE___THREAD); |
|
-#else |
|
= TLS_INIT_TP (tcbp, 0); |
|
-#endif |
|
if (__builtin_expect (lossage != NULL, 0)) |
|
_dl_fatal_printf ("cannot set up thread-local storage: %s\n", |
|
lossage);
|
|
|