summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2018-07-31 22:33:05 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-07-31 22:41:20 +0200
commitf195ea0e2f552e55cba47e5d2ad93996706a59ca (patch)
tree2a804e1d09c3cff225e1d78e52791a5f9f416c7e
parentf650932b34f23b94a49b245405db65c3b00bd0ed (diff)
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.
-rw-r--r--sysdeps/mach/hurd/i386/init-first.c68
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