diff options
Diffstat (limited to 'csu/libc-start.c')
-rw-r--r-- | csu/libc-start.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/csu/libc-start.c b/csu/libc-start.c index c2dd1593eb..6720617188 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -108,6 +108,8 @@ apply_irel (void) # define ARCH_INIT_CPU_FEATURES() #endif +#include <libc-start.h> + STATIC int LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), int argc, @@ -189,11 +191,16 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), ARCH_INIT_CPU_FEATURES (); /* Perform IREL{,A} relocations. */ - apply_irel (); + ARCH_SETUP_IREL (); /* The stack guard goes into the TCB, so initialize it early. */ __libc_setup_tls (); + /* In some architectures, IREL{,A} relocations happen after TLS setup in + order to let IFUNC resolvers benefit from TCB information, e.g. powerpc's + hwcap and platform fields available in the TCB. */ + ARCH_APPLY_IREL (); + /* Set up the stack checker's canary. */ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); # ifdef THREAD_SET_STACK_GUARD @@ -224,7 +231,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), __pointer_chk_guard_local = pointer_chk_guard; # endif -#endif +#endif /* !SHARED */ /* Register the destructor of the dynamic linker if there is any. */ if (__glibc_likely (rtld_fini != NULL)) |