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.
This commit is contained in:
Florian Weimer 2016-11-23 13:12:03 +01:00
parent b0216d3e4d
commit 7a5e3d9d63
2 changed files with 12 additions and 47 deletions

View File

@ -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]

View File

@ -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: