mirror of
https://mirrors.tuna.tsinghua.edu.cn/git/glibc.git
synced 2026-01-12 00:20:19 +08:00
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 <hjl.tools@gmail.com> Reviewed-by: Florian Weimer <fweimer@redhat.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user