mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 19:00:07 +00:00
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:
parent
b0216d3e4d
commit
7a5e3d9d63
@ -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]
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user