riscv: Drop reliance on _GLOBAL_OFFSET_TABLE_[0]

&__ehdr_start is a better way to get the load address.

This is similar to commits b37b75d269
(x86-64) and 43d06ed218 (aarch64).

Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
This commit is contained in:
Fangrui Song 2021-08-18 10:01:31 -07:00
parent 710ba420fd
commit 34b4624b04

View File

@ -76,27 +76,26 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
return 1;
}
/* Return the run-time load address of the shared object. */
static inline ElfW(Addr)
elf_machine_load_address (void)
{
extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
return (ElfW(Addr)) &__ehdr_start;
}
/* Return the link-time address of _DYNAMIC. */
static inline ElfW(Addr)
elf_machine_dynamic (void)
{
extern ElfW(Addr) _GLOBAL_OFFSET_TABLE_ __attribute__ ((visibility ("hidden")));
return _GLOBAL_OFFSET_TABLE_;
extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
}
#define STRINGXP(X) __STRING (X)
#define STRINGXV(X) STRINGV_ (X)
#define STRINGV_(...) # __VA_ARGS__
/* Return the run-time load address of the shared object. */
static inline ElfW(Addr)
elf_machine_load_address (void)
{
ElfW(Addr) load_addr;
asm ("lla %0, _DYNAMIC" : "=r" (load_addr));
return load_addr - elf_machine_dynamic ();
}
/* Initial entry point code for the dynamic linker.
The C function `_dl_start' is the real entry point;
its return value is the user program's entry point. */