diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-09-29 16:23:18 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-09-29 16:23:33 -0700 |
commit | 8172aad937f52fe4ae891a206492150815791f2a (patch) | |
tree | 97fc934222208804a3c483a88ae4b60fa0f0b67c | |
parent | 54464e749d91401ccf20a5dc1c7af86b752c9e0c (diff) | |
download | glibc-8172aad937f52fe4ae891a206492150815791f2a.tar.gz glibc-8172aad937f52fe4ae891a206492150815791f2a.tar.xz glibc-8172aad937f52fe4ae891a206492150815791f2a.zip |
arm: Update elf_machine_load_address for static PIE
When --enable-static-pie is used to configure glibc, we need to use _dl_relocate_static_pie to compute load address in static PIE. * sysdeps/arm/dl-machine.h (elf_machine_load_address): Use _dl_relocate_static_pie instead of _dl_start to compute load address in static PIE. Return 0 if _DYNAMIC is undefined for static executable.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | sysdeps/arm/dl-machine.h | 12 |
2 files changed, 18 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog index efd567ce34..b6dbff0624 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2017-09-29 H.J. Lu <hongjiu.lu@intel.com> + * sysdeps/arm/dl-machine.h (elf_machine_load_address): Use + _dl_relocate_static_pie instead of _dl_start to compute load + address in static PIE. Return 0 if _DYNAMIC is undefined for + static executable. + +2017-09-29 H.J. Lu <hongjiu.lu@intel.com> + * sysdeps/mips/dl-machine.h (elf_machine_dynamic): Return 0 if _DYNAMIC is undefined for static executable. diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h index 7d733f2b1c..efe2e1b3a3 100644 --- a/sysdeps/arm/dl-machine.h +++ b/sysdeps/arm/dl-machine.h @@ -53,10 +53,20 @@ elf_machine_dynamic (void) static inline Elf32_Addr __attribute__ ((unused)) elf_machine_load_address (void) { + Elf32_Addr pcrel_addr; +#ifdef SHARED extern Elf32_Addr __dl_start (void *) asm ("_dl_start"); Elf32_Addr got_addr = (Elf32_Addr) &__dl_start; - Elf32_Addr pcrel_addr; asm ("adr %0, _dl_start" : "=r" (pcrel_addr)); +#else + extern Elf32_Dyn _DYNAMIC[] __attribute__((weak, visibility ("hidden"))); + if (!_DYNAMIC) + return 0; + extern Elf32_Addr __dl_relocate_static_pie (void *) + asm ("_dl_relocate_static_pie") attribute_hidden; + Elf32_Addr got_addr = (Elf32_Addr) &__dl_relocate_static_pie; + asm ("adr %0, _dl_relocate_static_pie" : "=r" (pcrel_addr)); +#endif #ifdef __thumb__ /* Clear the low bit of the function address. |