aboutsummaryrefslogtreecommitdiff
path: root/ld/emultempl
diff options
context:
space:
mode:
authorHannes Domani <ssbssa@yahoo.de>2020-01-03 12:55:12 +0000
committerNick Clifton <nickc@redhat.com>2020-01-03 12:57:15 +0000
commitdc9bd8c92af67947db44b3cb428c050259b15cd0 (patch)
treef6115a6aabaced600c41c2b005e685593afa307b /ld/emultempl
parentb26a3d5827edcb942b3af5b921bf317bbc0c8e83 (diff)
downloadfsf-binutils-gdb-dc9bd8c92af67947db44b3cb428c050259b15cd0.zip
fsf-binutils-gdb-dc9bd8c92af67947db44b3cb428c050259b15cd0.tar.gz
fsf-binutils-gdb-dc9bd8c92af67947db44b3cb428c050259b15cd0.tar.bz2
For PE format files, the base relocation table is necessary if the image is loaded at a different image base than specified in the PE header. This patch provides a new option --enable-reloc-section to force the generation of this section.
* emultempl/pe.em: Add new option --enable-reloc-section. * emultempl/pep.em: Likewise. * ld.texi: Document --enable-reloc-section. * pe-dll.c (pe_dll_build_sections): Use pe_dll_enable_reloc_section. (pe_dll_fill_sections): Simplify by calling pe_exe_fill_sections. * pe-dll.h: Add extern declaration of option flag. * pep-dll.c (pe_dll_enable_reloc_section): Add alias define for pep_dll_enable_reloc_section. * pep-dll.h: Add extern declaration of option flag.
Diffstat (limited to 'ld/emultempl')
-rw-r--r--ld/emultempl/pe.em7
-rw-r--r--ld/emultempl/pep.em11
2 files changed, 16 insertions, 2 deletions
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 2b2f9e2..97fb146 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -270,6 +270,7 @@ fragment <<EOF
#define OPTION_INSERT_TIMESTAMP (OPTION_TERMINAL_SERVER_AWARE + 1)
#define OPTION_NO_INSERT_TIMESTAMP (OPTION_INSERT_TIMESTAMP + 1)
#define OPTION_BUILD_ID (OPTION_NO_INSERT_TIMESTAMP + 1)
+#define OPTION_ENABLE_RELOC_SECTION (OPTION_BUILD_ID + 1)
static void
gld${EMULATION_NAME}_add_options
@@ -349,6 +350,7 @@ gld${EMULATION_NAME}_add_options
{"wdmdriver", no_argument, NULL, OPTION_WDM_DRIVER},
{"tsaware", no_argument, NULL, OPTION_TERMINAL_SERVER_AWARE},
{"build-id", optional_argument, NULL, OPTION_BUILD_ID},
+ {"enable-reloc-section", no_argument, NULL, OPTION_ENABLE_RELOC_SECTION},
{NULL, no_argument, NULL, 0}
};
@@ -483,6 +485,7 @@ gld_${EMULATION_NAME}_list_options (FILE *file)
in object files\n"));
fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\
address space layout randomization (ASLR)\n"));
+ fprintf (file, _(" --enable-reloc-section Create the base relocation table\n"));
fprintf (file, _(" --forceinteg Code integrity checks are enforced\n"));
fprintf (file, _(" --nxcompat Image is compatible with data execution prevention\n"));
fprintf (file, _(" --no-isolation Image understands isolation but do not isolate the image\n"));
@@ -855,6 +858,9 @@ gld${EMULATION_NAME}_handle_option (int optc)
/* Get DLLCharacteristics bits */
case OPTION_DYNAMIC_BASE:
pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE;
+ /* fall through */
+ case OPTION_ENABLE_RELOC_SECTION:
+ pe_dll_enable_reloc_section = 1;
break;
case OPTION_FORCE_INTEGRITY:
pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY;
@@ -1947,6 +1953,7 @@ gld_${EMULATION_NAME}_finish (void)
#ifdef DLL_SUPPORT
if (bfd_link_pic (&link_info)
#if !defined(TARGET_IS_shpe)
+ || pe_dll_enable_reloc_section
|| (!bfd_link_relocatable (&link_info)
&& pe_def_file->num_exports != 0)
#endif
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index 2fef25e8..e8f5ca5 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -247,7 +247,8 @@ enum options
OPTION_INSERT_TIMESTAMP,
OPTION_NO_INSERT_TIMESTAMP,
OPTION_TERMINAL_SERVER_AWARE,
- OPTION_BUILD_ID
+ OPTION_BUILD_ID,
+ OPTION_ENABLE_RELOC_SECTION
};
static void
@@ -325,6 +326,7 @@ gld${EMULATION_NAME}_add_options
{"insert-timestamp", no_argument, NULL, OPTION_INSERT_TIMESTAMP},
{"no-insert-timestamp", no_argument, NULL, OPTION_NO_INSERT_TIMESTAMP},
{"build-id", optional_argument, NULL, OPTION_BUILD_ID},
+ {"enable-reloc-section", no_argument, NULL, OPTION_ENABLE_RELOC_SECTION},
{NULL, no_argument, NULL, 0}
};
@@ -448,6 +450,7 @@ gld_${EMULATION_NAME}_list_options (FILE *file)
layout randomization (ASLR)\n"));
fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\
address space layout randomization (ASLR)\n"));
+ fprintf (file, _(" --enable-reloc-section Create the base relocation table\n"));
fprintf (file, _(" --forceinteg Code integrity checks are enforced\n"));
fprintf (file, _(" --nxcompat Image is compatible with data execution prevention\n"));
fprintf (file, _(" --no-isolation Image understands isolation but do not isolate the image\n"));
@@ -799,9 +802,12 @@ gld${EMULATION_NAME}_handle_option (int optc)
/* Get DLLCharacteristics bits */
case OPTION_HIGH_ENTROPY_VA:
pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA;
- break;
+ /* fall through */
case OPTION_DYNAMIC_BASE:
pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE;
+ /* fall through */
+ case OPTION_ENABLE_RELOC_SECTION:
+ pep_dll_enable_reloc_section = 1;
break;
case OPTION_FORCE_INTEGRITY:
pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY;
@@ -1755,6 +1761,7 @@ gld_${EMULATION_NAME}_finish (void)
#ifdef DLL_SUPPORT
if (bfd_link_pic (&link_info)
+ || pep_dll_enable_reloc_section
|| (!bfd_link_relocatable (&link_info)
&& pep_def_file->num_exports != 0))
{