diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2022-01-03 06:50:20 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2022-01-12 06:04:29 -0800 |
commit | 6a91be866619c592762cd7e9b034a9f7ad27ef37 (patch) | |
tree | 0e6f3c1cb84ecdee20857f3ba3f2087bf0425e06 /ld/scripttempl | |
parent | e2cbf4df83fe57892a6aaedf737b84baa6321fa7 (diff) | |
download | gdb-6a91be866619c592762cd7e9b034a9f7ad27ef37.zip gdb-6a91be866619c592762cd7e9b034a9f7ad27ef37.tar.gz gdb-6a91be866619c592762cd7e9b034a9f7ad27ef37.tar.bz2 |
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.
Diffstat (limited to 'ld/scripttempl')
-rw-r--r-- | ld/scripttempl/elf.sc | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc index a9a39ad..f3552a4 100644 --- a/ld/scripttempl/elf.sc +++ b/ld/scripttempl/elf.sc @@ -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 |