diff options
-rw-r--r-- | elf/rtld.c | 9 | ||||
-rw-r--r-- | include/elf.h | 13 |
2 files changed, 17 insertions, 5 deletions
@@ -476,11 +476,10 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) #endif _dl_setup_hash (&_dl_rtld_map); _dl_rtld_map.l_real = &_dl_rtld_map; - _dl_rtld_map.l_map_start = (ElfW(Addr)) &__ehdr_start; - /* Prevent run-time relocations against __ehdr_start and _end. */ - asm ("" : "+g" (_dl_rtld_map.l_map_start)); - _dl_rtld_map.l_map_end = (ElfW(Addr)) _end; - asm ("" : "+g" (_dl_rtld_map.l_map_end)); + _dl_rtld_map.l_map_start + = (ElfW(Addr)) DL_ADDRESS_WITHOUT_RELOC (&__ehdr_start); + _dl_rtld_map.l_map_end + = (ElfW(Addr)) DL_ADDRESS_WITHOUT_RELOC (_end); /* Copy the TLS related data if necessary. */ #ifndef DONT_USE_BOOTSTRAP_MAP # if NO_TLS_OFFSET != 0 diff --git a/include/elf.h b/include/elf.h index 14ed67f..1424982 100644 --- a/include/elf.h +++ b/include/elf.h @@ -15,6 +15,19 @@ # define ELF_NOTE_NEXT_OFFSET(namesz, descsz, align) \ ALIGN_UP (ELF_NOTE_DESC_OFFSET ((namesz), (align)) + (descsz), (align)) +# ifdef HIDDEN_VAR_NEEDS_DYNAMIC_RELOC +# define DL_ADDRESS_WITHOUT_RELOC(expr) (expr) +# else +/* Evaluate EXPR without run-time relocation for it. EXPR should be an + array, an address of an object, or a string literal. */ +# define DL_ADDRESS_WITHOUT_RELOC(expr) \ + ({ \ + __auto_type _result = (expr); \ + asm ("" : "+r" (_result)); \ + _result; \ + }) +# endif + /* Some information which is not meant for the public and therefore not in <elf.h>. */ # include <dl-dtprocnum.h> |