diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2025-06-15 11:38:54 +0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2025-07-01 03:44:52 +0800 |
commit | 632d895f3e5d98162f77b9c3c1da4ec19968b671 (patch) | |
tree | ff518d76b0ee71a79bd5696b4b1d65380d5095c5 | |
parent | eeb7b079d5d8785e760ca08c3692ffa579bbb737 (diff) | |
download | glibc-master.zip glibc-master.tar.gz glibc-master.tar.bz2 |
Add DL_ADDRESS_WITHOUT_RELOC to force an address into a general purpose
register to prevent loading it into a vector register directly before
run-time relocation. This is an updated fix for BZ #33088.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Florian Weimer <fweimer@redhat.com>
-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> |