mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-11 18:06:03 +08:00
ld: Initial DT_RELR support
Add a -z pack-relative-relocs option to enable DT_RELR and create a relr.dyn section for DT_RELR. DT_RELR is implemented with the linker relaxation infrastructure, but it doesn't require the --relax option enabled. -z pack-relative-relocs implies -z combreloc. -z nocombreloc implies -z nopack-relative-relocs. -z pack-relative-relocs is chosen over the similar option in lld, --pack-dyn-relocs=relr, to implement a glibc binary lockout mechanism with a special glibc version symbol, to avoid random crashes of DT_RELR binaries with the existing glibc binaries. bfd/ * elf-bfd.h (elf_link_hash_table): Add srelrdyn. * elflink.c (_bfd_elf_link_create_dynamic_sections): Create a .relr.dyn section for DT_RELR. include/ * bfdlink.h (bfd_link_info): Add enable_dt_relr. ld/ * News: Mention -z pack-relative-relocs and -z nopack-relative-relocs. * ld.texi: Document -z pack-relative-relocs and -z nopack-relative-relocs. * ldelf.c (ldelf_after_parse): Disable DT_RELR if not building PIE nor shared library. Add 3 spare dynamic tags for DT_RELR, DT_RELRSZ and DT_RELRENT. * ldlang.c (lang_relax_sections): Also enable relaxation if DT_RELR is enabled. * emulparams/elf32_x86_64.sh: Source dt-relr.sh. * emulparams/elf_i386.sh: Likewise. * emulparams/elf_x86_64.sh: Likewise. * emulparams/dt-relr.sh: New file. * scripttempl/elf.sc: Support .relr.dyn.
This commit is contained in:
@ -10,6 +10,7 @@
|
||||
# empty.
|
||||
# HAVE_NOINIT - Include a .noinit output section in the script.
|
||||
# HAVE_PERSISTENT - Include a .persistent output section in the script.
|
||||
# HAVE_DT_RELR - Include a .relr.dyn output section in the script.
|
||||
# SMALL_DATA_CTOR - .ctors contains small data.
|
||||
# SMALL_DATA_DTOR - .dtors contains small data.
|
||||
# DATA_ADDR - if end-of-text-plus-one-page isn't right for data start
|
||||
@ -520,6 +521,9 @@ emit_dyn()
|
||||
fi
|
||||
fi
|
||||
rm -f ldscripts/dyntmp.$$
|
||||
if test -n "${COMBRELOC}" && test -n "${HAVE_DT_RELR}"; then
|
||||
echo " .relr.dyn : { *(.relr.dyn) }"
|
||||
fi
|
||||
}
|
||||
|
||||
test -n "${NON_ALLOC_DYN}${SEPARATE_CODE}" || emit_dyn
|
||||
|
Reference in New Issue
Block a user