From 6a91be866619c592762cd7e9b034a9f7ad27ef37 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 3 Jan 2022 06:50:20 -0800 Subject: 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. --- include/bfdlink.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'include/bfdlink.h') diff --git a/include/bfdlink.h b/include/bfdlink.h index 01f57c2..92e3e32 100644 --- a/include/bfdlink.h +++ b/include/bfdlink.h @@ -413,6 +413,10 @@ struct bfd_link_info /* TRUE if PT_GNU_RELRO segment should be created. */ unsigned int relro: 1; + /* TRUE if DT_RELR should be enabled for compact relative + relocations. */ + unsigned int enable_dt_relr: 1; + /* TRUE if separate code segment should be created. */ unsigned int separate_code: 1; -- cgit v1.1