aboutsummaryrefslogtreecommitdiff
path: root/csu/libc-start.c
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2021-01-19 17:17:01 +0000
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2021-01-21 15:55:10 +0000
commit86d439b06fb29af8d063ee8855ff63a863f46ef3 (patch)
treee276fafa0911c561e05afab86df2127909299945 /csu/libc-start.c
parent47618209d05a0e77932038f21c6bba2425bd75c6 (diff)
downloadglibc-86d439b06fb29af8d063ee8855ff63a863f46ef3.zip
glibc-86d439b06fb29af8d063ee8855ff63a863f46ef3.tar.gz
glibc-86d439b06fb29af8d063ee8855ff63a863f46ef3.tar.bz2
csu: Move static pie self relocation later [BZ #27072]
IFUNC resolvers may depend on tunables and cpu feature setup so move static pie self relocation after those. It is hard to guarantee that the ealy startup code does not rely on relocations so this is a bit fragile. It would be more robust to handle RELATIVE relocs early and only IRELATIVE relocs later, but the current relocation processing code cannot do that. The early startup code up to relocation processing includes _dl_aux_init (auxvec); __libc_init_secure (); __tunables_init (__environ); ARCH_INIT_CPU_FEATURES (); _dl_relocate_static_pie (); These are simple enough that RELATIVE relocs can be avoided. The following steps include ARCH_SETUP_IREL (); ARCH_SETUP_TLS (); ARCH_APPLY_IREL (); On some targets IRELATIVE processing relies on TLS setup on others TLS setup relies on IRELATIVE relocs, so the right position for _dl_relocate_static_pie is target dependent. For now move self relocation as early as possible on targets that support static PIE. Fixes bug 27072. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'csu/libc-start.c')
-rw-r--r--csu/libc-start.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/csu/libc-start.c b/csu/libc-start.c
index a2f6e12..feb0d7c 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -146,8 +146,6 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
int result;
#ifndef SHARED
- _dl_relocate_static_pie ();
-
char **ev = &argv[argc + 1];
__environ = ev;
@@ -199,6 +197,11 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
ARCH_INIT_CPU_FEATURES ();
+ /* Do static pie self relocation after tunables and cpu features
+ are setup for ifunc resolvers. Before this point relocations
+ must be avoided. */
+ _dl_relocate_static_pie ();
+
/* Perform IREL{,A} relocations. */
ARCH_SETUP_IREL ();