diff options
author | Florian Weimer <fweimer@redhat.com> | 2016-11-23 13:12:03 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2016-11-23 13:12:03 +0100 |
commit | 7a5e3d9d633c828d84a9535f26b202a6179978e7 (patch) | |
tree | d90227bd1ddf169cf7d986cbd89e8b66cca1d551 | |
parent | b0216d3e4d98a3528bad428c22ff96fcbcc102a4 (diff) | |
download | glibc-7a5e3d9d633c828d84a9535f26b202a6179978e7.tar.gz glibc-7a5e3d9d633c828d84a9535f26b202a6179978e7.tar.xz glibc-7a5e3d9d633c828d84a9535f26b202a6179978e7.zip |
elf: Assume TLS is initialized in _dl_map_object_from_fd
libc.so uses TLS data, so when dlopen is called later, the TLS data structures have already been initialized.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | elf/dl-load.c | 54 |
2 files changed, 12 insertions, 47 deletions
diff --git a/ChangeLog b/ChangeLog index 57935c6dab..03ee791c29 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-11-23 Florian Weimer <fweimer@redhat.com> + + * elf/dl-load.c (_dl_map_object_from_fd): Delayed TLS data + structure initialization is no longer needed. + 2016-11-23 Joseph Myers <joseph@codesourcery.com> [BZ #20855] diff --git a/elf/dl-load.c b/elf/dl-load.c index c0d6249373..51fb0d005c 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1135,54 +1135,14 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd, } #ifdef SHARED - if (l->l_prev == NULL || (mode & __RTLD_AUDIT) != 0) - /* We are loading the executable itself when the dynamic linker - was executed directly. The setup will happen later. */ - break; - -# ifdef _LIBC_REENTRANT - /* In a static binary there is no way to tell if we dynamically - loaded libpthread. */ - if (GL(dl_error_catch_tsd) == &_dl_initial_error_catch_tsd) -# endif + /* We are loading the executable itself when the dynamic + linker was executed directly. The setup will happen + later. Otherwise, the TLS data structures are already + initialized, and we assigned a TLS modid above. */ + assert (l->l_prev == NULL || (mode & __RTLD_AUDIT) != 0); +#else + assert (false && "TLS not initialized in static application"); #endif - { - /* We have not yet loaded libpthread. - We can do the TLS setup right now! */ - - void *tcb; - - /* The first call allocates TLS bookkeeping data structures. - Then we allocate the TCB for the initial thread. */ - if (__glibc_unlikely (_dl_tls_setup ()) - || __glibc_unlikely ((tcb = _dl_allocate_tls (NULL)) == NULL)) - { - errval = ENOMEM; - errstring = N_("\ -cannot allocate TLS data structures for initial thread"); - goto call_lose; - } - - /* Now we install the TCB in the thread register. */ - errstring = TLS_INIT_TP (tcb); - if (__glibc_likely (errstring == NULL)) - { - /* Now we are all good. */ - l->l_tls_modid = ++GL(dl_tls_max_dtv_idx); - break; - } - - /* The kernel is too old or somesuch. */ - errval = 0; - _dl_deallocate_tls (tcb, 1); - goto call_lose; - } - - /* Uh-oh, the binary expects TLS support but we cannot - provide it. */ - errval = 0; - errstring = N_("cannot handle TLS data"); - goto call_lose; break; case PT_GNU_STACK: |