From 632d895f3e5d98162f77b9c3c1da4ec19968b671 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 15 Jun 2025 11:38:54 +0800 Subject: [PATCH] elf: Add DL_ADDRESS_WITHOUT_RELOC [BZ #33088] 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 Reviewed-by: Florian Weimer --- elf/rtld.c | 9 ++++----- include/elf.h | 13 +++++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/elf/rtld.c b/elf/rtld.c index e6a181dc310..9038a507997 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -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 14ed67ff67d..1424982bb59 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 . */ # include -- 2.39.5