Use the first element of GOT for ld.so addresses

[BZ #14538]
	* sysdeps/x86_64/dl-machine.h (elf_machine_dynamic): Use the
	first element of the GOT.
	(elf_machine_load_address): Return the difference between
	the runtime address of _DYNAMIC and elf_machine_dynamic ().
This commit is contained in:
H.J. Lu 2012-09-02 05:22:24 -07:00
parent 0786794f3a
commit 5f30cfec00
3 changed files with 20 additions and 36 deletions

View File

@ -1,3 +1,11 @@
2012-09-02 H.J. Lu <hongjiu.lu@intel.com>
[BZ #14538]
* sysdeps/x86_64/dl-machine.h (elf_machine_dynamic): Use the
first element of the GOT.
(elf_machine_load_address): Return the difference between
the runtime address of _DYNAMIC and elf_machine_dynamic ().
2012-09-01 Allan McRae <allan@archlinux.org> 2012-09-01 Allan McRae <allan@archlinux.org>
[BZ #13412] [BZ #13412]

2
NEWS
View File

@ -12,7 +12,7 @@ Version 2.17
3479, 5400, 6778, 6808, 9685, 11607, 13412, 13717, 13696, 13939, 14042, 3479, 5400, 6778, 6808, 9685, 11607, 13412, 13717, 13696, 13939, 14042,
14090, 14166, 14150, 14151, 14154, 14157, 14166, 14173, 14195, 14252, 14090, 14166, 14150, 14151, 14154, 14157, 14166, 14173, 14195, 14252,
14283, 14298, 14303, 14307, 14328, 14331, 14336, 14337, 14347, 14349, 14283, 14298, 14303, 14307, 14328, 14331, 14336, 14337, 14347, 14349,
14459, 14476, 14505, 14516, 14519, 14532 14459, 14476, 14505, 14516, 14519, 14532, 14538
* Support for STT_GNU_IFUNC symbols added for s390 and s390x. * Support for STT_GNU_IFUNC symbols added for s390 and s390x.
Optimized versions of memcpy, memset, and memcmp added for System z10 and Optimized versions of memcpy, memset, and memcmp added for System z10 and

View File

@ -41,13 +41,9 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
static inline ElfW(Addr) __attribute__ ((unused)) static inline ElfW(Addr) __attribute__ ((unused))
elf_machine_dynamic (void) elf_machine_dynamic (void)
{ {
ElfW(Addr) addr; /* This produces an IP-relative reloc which is resolved at link time. */
extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] attribute_hidden;
/* This works because we have our GOT address available in the small PIC return _GLOBAL_OFFSET_TABLE_[0];
model. */
addr = (ElfW(Addr)) &_DYNAMIC;
return addr;
} }
@ -55,31 +51,11 @@ elf_machine_dynamic (void)
static inline ElfW(Addr) __attribute__ ((unused)) static inline ElfW(Addr) __attribute__ ((unused))
elf_machine_load_address (void) elf_machine_load_address (void)
{ {
ElfW(Addr) addr; /* Compute the difference between the runtime address of _DYNAMIC as seen
by an IP-relative reference, and the link-time address found in the
/* The easy way is just the same as on x86: special unrelocated first GOT entry. */
leaq _dl_start, %0 extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
leaq _dl_start(%%rip), %1 return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic ();
subq %0, %1
but this does not work with binutils since we then have
a R_X86_64_32S relocation in a shared lib.
Instead we store the address of _dl_start in the data section
and compare it with the current value that we can get via
an RIP relative addressing mode. Note that this is the address
of _dl_start before any relocation performed at runtime. In case
the binary is prelinked the resulting "address" is actually a
load offset which is zero if the binary was loaded at the address
it is prelinked for. */
asm ("lea _dl_start(%%rip), %0\n\t"
"sub 1f(%%rip), %0\n\t"
".section\t.data.rel.ro\n"
"1:\t" ASM_ADDR " _dl_start\n\t"
".previous\n\t"
: "=r" (addr) : : "cc");
return addr;
} }
/* Set up the loaded object described by L so its unrelocated PLT /* Set up the loaded object described by L so its unrelocated PLT