diff options
author | Hannes Domani <ssbssa@yahoo.de> | 2020-01-03 12:55:12 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2020-01-03 12:57:15 +0000 |
commit | dc9bd8c92af67947db44b3cb428c050259b15cd0 (patch) | |
tree | f6115a6aabaced600c41c2b005e685593afa307b /ld/emultempl | |
parent | b26a3d5827edcb942b3af5b921bf317bbc0c8e83 (diff) | |
download | gdb-dc9bd8c92af67947db44b3cb428c050259b15cd0.zip gdb-dc9bd8c92af67947db44b3cb428c050259b15cd0.tar.gz 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.em | 7 | ||||
-rw-r--r-- | ld/emultempl/pep.em | 11 |
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)) { |