ld: Initial DT_RELR support
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 3 Jan 2022 14:50:20 +0000 (06:50 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 12 Jan 2022 14:04:29 +0000 (06:04 -0800)
commit6a91be866619c592762cd7e9b034a9f7ad27ef37
tree0e6f3c1cb84ecdee20857f3ba3f2087bf0425e06
parente2cbf4df83fe57892a6aaedf737b84baa6321fa7
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.
12 files changed:
bfd/elf-bfd.h
bfd/elflink.c
include/bfdlink.h
ld/NEWS
ld/emulparams/dt-relr.sh [new file with mode: 0644]
ld/emulparams/elf32_x86_64.sh
ld/emulparams/elf_i386.sh
ld/emulparams/elf_x86_64.sh
ld/ld.texi
ld/ldelf.c
ld/ldlang.c
ld/scripttempl/elf.sc