aboutsummaryrefslogtreecommitdiff
path: root/ld/emulparams
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2022-01-03 06:50:20 -0800
committerH.J. Lu <hjl.tools@gmail.com>2022-01-12 06:04:29 -0800
commit6a91be866619c592762cd7e9b034a9f7ad27ef37 (patch)
tree0e6f3c1cb84ecdee20857f3ba3f2087bf0425e06 /ld/emulparams
parente2cbf4df83fe57892a6aaedf737b84baa6321fa7 (diff)
downloadgdb-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/emulparams')
-rw-r--r--ld/emulparams/dt-relr.sh18
-rw-r--r--ld/emulparams/elf32_x86_64.sh1
-rw-r--r--ld/emulparams/elf_i386.sh1
-rw-r--r--ld/emulparams/elf_x86_64.sh1
4 files changed, 21 insertions, 0 deletions
diff --git a/ld/emulparams/dt-relr.sh b/ld/emulparams/dt-relr.sh
new file mode 100644
index 0000000..b2b403c
--- /dev/null
+++ b/ld/emulparams/dt-relr.sh
@@ -0,0 +1,18 @@
+HAVE_DT_RELR=yes
+PARSE_AND_LIST_OPTIONS_PACK_RELATIVE_RELOCS='
+ fprintf (file, _("\
+ -z pack-relative-relocs Pack relative relocations\n"));
+ fprintf (file, _("\
+ -z nopack-relative-relocs Do not pack relative relocations (default)\n"));
+'
+
+PARSE_AND_LIST_ARGS_CASE_Z_PACK_RELATIVE_RELOCS='
+ else if (strcmp (optarg, "pack-relative-relocs") == 0)
+ link_info.enable_dt_relr = true;
+ else if (strcmp (optarg, "nopack-relative-relocs") == 0)
+ link_info.enable_dt_relr = false;
+'
+
+
+PARSE_AND_LIST_OPTIONS="$PARSE_AND_LIST_OPTIONS $PARSE_AND_LIST_OPTIONS_PACK_RELATIVE_RELOCS"
+PARSE_AND_LIST_ARGS_CASE_Z="$PARSE_AND_LIST_ARGS_CASE_Z $PARSE_AND_LIST_ARGS_CASE_Z_PACK_RELATIVE_RELOCS"
diff --git a/ld/emulparams/elf32_x86_64.sh b/ld/emulparams/elf32_x86_64.sh
index ac0a7aa..4bff412 100644
--- a/ld/emulparams/elf32_x86_64.sh
+++ b/ld/emulparams/elf32_x86_64.sh
@@ -7,6 +7,7 @@ source_sh ${srcdir}/emulparams/cet.sh
source_sh ${srcdir}/emulparams/x86-report-relative.sh
source_sh ${srcdir}/emulparams/x86-64-level.sh
source_sh ${srcdir}/emulparams/static.sh
+source_sh ${srcdir}/emulparams/dt-relr.sh
SCRIPT_NAME=elf
ELFSIZE=32
OUTPUT_FORMAT="elf32-x86-64"
diff --git a/ld/emulparams/elf_i386.sh b/ld/emulparams/elf_i386.sh
index 98532e5..ae17bb4 100644
--- a/ld/emulparams/elf_i386.sh
+++ b/ld/emulparams/elf_i386.sh
@@ -6,6 +6,7 @@ source_sh ${srcdir}/emulparams/cet.sh
source_sh ${srcdir}/emulparams/x86-report-relative.sh
source_sh ${srcdir}/emulparams/x86-64-level.sh
source_sh ${srcdir}/emulparams/static.sh
+source_sh ${srcdir}/emulparams/dt-relr.sh
SCRIPT_NAME=elf
OUTPUT_FORMAT="elf32-i386"
NO_RELA_RELOCS=yes
diff --git a/ld/emulparams/elf_x86_64.sh b/ld/emulparams/elf_x86_64.sh
index 48d0974..5f2743e 100644
--- a/ld/emulparams/elf_x86_64.sh
+++ b/ld/emulparams/elf_x86_64.sh
@@ -8,6 +8,7 @@ source_sh ${srcdir}/emulparams/x86-report-relative.sh
source_sh ${srcdir}/emulparams/x86-64-level.sh
source_sh ${srcdir}/emulparams/x86-64-lam.sh
source_sh ${srcdir}/emulparams/static.sh
+source_sh ${srcdir}/emulparams/dt-relr.sh
SCRIPT_NAME=elf
ELFSIZE=64
OUTPUT_FORMAT="elf64-x86-64"