diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-07-31 22:33:05 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-07-31 22:41:20 +0200 |
commit | f195ea0e2f552e55cba47e5d2ad93996706a59ca (patch) | |
tree | 2a804e1d09c3cff225e1d78e52791a5f9f416c7e /sysdeps/mach | |
parent | f650932b34f23b94a49b245405db65c3b00bd0ed (diff) | |
download | glibc-f195ea0e2f552e55cba47e5d2ad93996706a59ca.tar.gz glibc-f195ea0e2f552e55cba47e5d2ad93996706a59ca.tar.xz glibc-f195ea0e2f552e55cba47e5d2ad93996706a59ca.zip |
hurd: Fix startup of static binaries linked against libpthread
* sysdeps/mach/hurd/i386/init-first.c (init1): Move ELF hdr and TLS initialization... (init): ... before initializing libpthread.
Diffstat (limited to 'sysdeps/mach')
-rw-r--r-- | sysdeps/mach/hurd/i386/init-first.c | 68 |
1 files changed, 35 insertions, 33 deletions
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c index 8b6e62be14..f8ad2ceb8e 100644 --- a/sysdeps/mach/hurd/i386/init-first.c +++ b/sysdeps/mach/hurd/i386/init-first.c @@ -104,39 +104,6 @@ init1 (int argc, char *arg0, ...) ++envp; d = (void *) ++envp; -#ifndef SHARED - /* If we are the bootstrap task started by the kernel, - then after the environment pointers there is no Hurd - data block; the argument strings start there. */ - if ((void *) d == argv[0] || d->phdr == 0) - { - /* With a new enough linker (binutils-2.23 or better), - the magic __ehdr_start symbol will be available and - __libc_start_main will have done this that way already. */ - if (_dl_phdr == NULL) - { - /* We may need to see our own phdrs, e.g. for TLS setup. - Try the usual kludge to find the headers without help from - the exec server. */ - extern const void __executable_start; - const ElfW(Ehdr) *const ehdr = &__executable_start; - _dl_phdr = (const void *) ehdr + ehdr->e_phoff; - _dl_phnum = ehdr->e_phnum; - assert (ehdr->e_phentsize == sizeof (ElfW(Phdr))); - } - } - else - { - __libc_enable_secure = d->flags & EXEC_SECURE; - - _dl_phdr = (ElfW(Phdr) *) d->phdr; - _dl_phnum = d->phdrsz / sizeof (ElfW(Phdr)); - assert (d->phdrsz % sizeof (ElfW(Phdr)) == 0); - } - - __libc_setup_tls (); -#endif - /* Initialize libpthread if linked in. */ if (__pthread_initialize_minimal != NULL) __pthread_initialize_minimal (); @@ -145,6 +112,10 @@ init1 (int argc, char *arg0, ...) /* No Hurd data block to process. */ return; +#ifndef SHARED + __libc_enable_secure = d->flags & EXEC_SECURE; +#endif + _hurd_init_dtable = d->dtable; _hurd_init_dtablesize = d->dtablesize; @@ -189,6 +160,37 @@ init (int *data) ++envp; d = (void *) ++envp; +#ifndef SHARED + /* If we are the bootstrap task started by the kernel, + then after the environment pointers there is no Hurd + data block; the argument strings start there. */ + if ((void *) d == argv[0] || d->phdr == 0) + { + /* With a new enough linker (binutils-2.23 or better), + the magic __ehdr_start symbol will be available and + __libc_start_main will have done this that way already. */ + if (_dl_phdr == NULL) + { + /* We may need to see our own phdrs, e.g. for TLS setup. + Try the usual kludge to find the headers without help from + the exec server. */ + extern const void __executable_start; + const ElfW(Ehdr) *const ehdr = &__executable_start; + _dl_phdr = (const void *) ehdr + ehdr->e_phoff; + _dl_phnum = ehdr->e_phnum; + assert (ehdr->e_phentsize == sizeof (ElfW(Phdr))); + } + } + else + { + _dl_phdr = (ElfW(Phdr) *) d->phdr; + _dl_phnum = d->phdrsz / sizeof (ElfW(Phdr)); + assert (d->phdrsz % sizeof (ElfW(Phdr)) == 0); + } + + /* We need to setup TLS before initializing libpthread. */ + __libc_setup_tls (); +#endif /* After possibly switching stacks, call `init1' (above) with the user code as the return address, and the argument data immediately above |