mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 17:53:37 +08:00
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:
parent
0786794f3a
commit
5f30cfec00
14
ChangeLog
14
ChangeLog
@ -1,8 +1,16 @@
|
||||
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>
|
||||
|
||||
[BZ #13412]
|
||||
* configure.in (AWK): Require gawk version 3.0 or later.
|
||||
* configure: Regenerated.
|
||||
[BZ #13412]
|
||||
* configure.in (AWK): Require gawk version 3.0 or later.
|
||||
* configure: Regenerated.
|
||||
|
||||
2012-09-01 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
|
2
NEWS
2
NEWS
@ -12,7 +12,7 @@ Version 2.17
|
||||
3479, 5400, 6778, 6808, 9685, 11607, 13412, 13717, 13696, 13939, 14042,
|
||||
14090, 14166, 14150, 14151, 14154, 14157, 14166, 14173, 14195, 14252,
|
||||
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.
|
||||
Optimized versions of memcpy, memset, and memcmp added for System z10 and
|
||||
|
@ -41,13 +41,9 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
|
||||
static inline ElfW(Addr) __attribute__ ((unused))
|
||||
elf_machine_dynamic (void)
|
||||
{
|
||||
ElfW(Addr) addr;
|
||||
|
||||
/* This works because we have our GOT address available in the small PIC
|
||||
model. */
|
||||
addr = (ElfW(Addr)) &_DYNAMIC;
|
||||
|
||||
return addr;
|
||||
/* This produces an IP-relative reloc which is resolved at link time. */
|
||||
extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] attribute_hidden;
|
||||
return _GLOBAL_OFFSET_TABLE_[0];
|
||||
}
|
||||
|
||||
|
||||
@ -55,31 +51,11 @@ elf_machine_dynamic (void)
|
||||
static inline ElfW(Addr) __attribute__ ((unused))
|
||||
elf_machine_load_address (void)
|
||||
{
|
||||
ElfW(Addr) addr;
|
||||
|
||||
/* The easy way is just the same as on x86:
|
||||
leaq _dl_start, %0
|
||||
leaq _dl_start(%%rip), %1
|
||||
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;
|
||||
/* Compute the difference between the runtime address of _DYNAMIC as seen
|
||||
by an IP-relative reference, and the link-time address found in the
|
||||
special unrelocated first GOT entry. */
|
||||
extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
|
||||
return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic ();
|
||||
}
|
||||
|
||||
/* Set up the loaded object described by L so its unrelocated PLT
|
||||
|
Loading…
Reference in New Issue
Block a user