helper variable into .data.rel.ro. Simplify the code. Extend

comment to explain prelinking.
This commit is contained in:
Ulrich Drepper 2005-07-31 17:50:49 +00:00
parent 960095134b
commit 943525d000
2 changed files with 11 additions and 7 deletions

View File

@ -1,7 +1,8 @@
2005-07-31 Ulrich Drepper <drepper@redhat.com> 2005-07-31 Ulrich Drepper <drepper@redhat.com>
* sysdeps/x86_64/dl-machine.h (elf_machine_load_address): Move * sysdeps/x86_64/dl-machine.h (elf_machine_load_address): Move
helper variable into .data.rel.ro. Remove unnecessary label. helper variable into .data.rel.ro. Simplify the code. Extend
comment to explain prelinking.
2005-07-31 Andreas Jaeger <aj@suse.de> 2005-07-31 Andreas Jaeger <aj@suse.de>

View File

@ -55,7 +55,7 @@ elf_machine_dynamic (void)
static inline Elf64_Addr __attribute__ ((unused)) static inline Elf64_Addr __attribute__ ((unused))
elf_machine_load_address (void) elf_machine_load_address (void)
{ {
register Elf64_Addr addr, tmp; Elf64_Addr addr;
/* The easy way is just the same as on x86: /* The easy way is just the same as on x86:
leaq _dl_start, %0 leaq _dl_start, %0
@ -66,15 +66,18 @@ elf_machine_load_address (void)
Instead we store the address of _dl_start in the data section Instead we store the address of _dl_start in the data section
and compare it with the current value that we can get via and compare it with the current value that we can get via
an RIP relative addressing mode. */ 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 ("movq 1f(%%rip), %1\n" asm ("leaq _dl_start(%%rip), %0\n\t"
"leaq _dl_start(%%rip), %0\n\t" "subq 1f(%%rip), %0\n\t"
"subq %1, %0\n\t"
".section\t.data.rel.ro\n" ".section\t.data.rel.ro\n"
"1:\t.quad _dl_start\n\t" "1:\t.quad _dl_start\n\t"
".previous\n\t" ".previous\n\t"
: "=r" (addr), "=r" (tmp) : : "cc"); : "=r" (addr) : : "cc");
return addr; return addr;
} }