aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2025-06-15 11:38:54 +0800
committerH.J. Lu <hjl.tools@gmail.com>2025-07-01 03:44:52 +0800
commit632d895f3e5d98162f77b9c3c1da4ec19968b671 (patch)
treeff518d76b0ee71a79bd5696b4b1d65380d5095c5
parenteeb7b079d5d8785e760ca08c3692ffa579bbb737 (diff)
downloadglibc-master.zip
glibc-master.tar.gz
glibc-master.tar.bz2
elf: Add DL_ADDRESS_WITHOUT_RELOC [BZ #33088]HEADmaster
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.c9
-rw-r--r--include/elf.h13
2 files changed, 17 insertions, 5 deletions
diff --git a/elf/rtld.c b/elf/rtld.c
index e6a181d..9038a50 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 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>