diff options
author | Jeremy Drake <sourceware-bugzilla@jdrake.com> | 2020-08-27 12:58:27 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2020-08-27 12:58:27 +0100 |
commit | 514b4e191d5f46de8e142fe216e677a35fa9c4bb (patch) | |
tree | f4173c8f49e5987adc1cd1dd4c515c9493bbe268 /ld/emultempl | |
parent | f2e5245f4169c2a1849ba998872e245c1b303950 (diff) | |
download | gdb-514b4e191d5f46de8e142fe216e677a35fa9c4bb.zip gdb-514b4e191d5f46de8e142fe216e677a35fa9c4bb.tar.gz gdb-514b4e191d5f46de8e142fe216e677a35fa9c4bb.tar.bz2 |
Change the default characteristics of DLLs built by the linker to more secure settings.
PR 19011
* emultempl/pe.em (DEFAULT_DLL_CHARACTERISTICS): Define.
(pe_dll_characteristics): Initialise to DEFAULT_DLL_CHARACTERISTICS.
(add_options): Add options to disable DLL characteristics.
(list_options): List the new options.
(handle_options): Handle the new options.
* emultempl/pep.em: Similar changes to above.
(NT_EXE_IMAGE_BASE): Default to an address above 4G.
(NT_DLL_IMAGE_BASE, NT_DLL_AUTO_IMAGE_BASE,
(NT_DLL_AUTO_IMAGE_MASK): Likewise.
* ld.texi: Document the new options.
* pe-dll.c (pe_dll_enable_reloc_section): Change to default to
true.
(generate_reloc): Do nothing if there is no reloc section.
(pe_exe_fill_sections): Only assign the reloc section contents if
the section exists.
* testsuite/ld-pe/pe.exp: Add the --disable-reloc-section flag to
the .secrel32 tests.
* testsuite/ld-scripts/provide-8.d: Expect for fail on PE targets.
* NEWS: Mention the change in DLL generation.
Diffstat (limited to 'ld/emultempl')
-rw-r--r-- | ld/emultempl/pe.em | 75 | ||||
-rw-r--r-- | ld/emultempl/pep.em | 91 |
2 files changed, 138 insertions, 28 deletions
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index eb7c812..9d2097f 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -104,6 +104,9 @@ fragment <<EOF #define DEFAULT_PSEUDO_RELOC_VERSION 1 #endif +#define DEFAULT_DLL_CHARACTERISTICS (IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE \ + | IMAGE_DLL_CHARACTERISTICS_NX_COMPAT) + #if defined(TARGET_IS_i386pe) || ! defined(DLL_SUPPORT) #define PE_DEF_SUBSYSTEM 3 #else @@ -129,7 +132,7 @@ static flagword real_flags = 0; static int support_old_code = 0; static char * thumb_entry_symbol = NULL; static lang_assignment_statement_type *image_base_statement = 0; -static unsigned short pe_dll_characteristics = 0; +static unsigned short pe_dll_characteristics = DEFAULT_DLL_CHARACTERISTICS; static bfd_boolean insert_timestamp = TRUE; static const char *emit_build_id; @@ -271,6 +274,17 @@ fragment <<EOF #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) +#define OPTION_DISABLE_RELOC_SECTION (OPTION_ENABLE_RELOC_SECTION + 1) +/* DLL Characteristics flags. */ +#define OPTION_DISABLE_DYNAMIC_BASE (OPTION_DISABLE_RELOC_SECTION + 1) +#define OPTION_DISABLE_FORCE_INTEGRITY (OPTION_DISABLE_DYNAMIC_BASE + 1) +#define OPTION_DISABLE_NX_COMPAT (OPTION_DISABLE_FORCE_INTEGRITY + 1) +#define OPTION_DISABLE_NO_ISOLATION (OPTION_DISABLE_NX_COMPAT + 1) +#define OPTION_DISABLE_NO_SEH (OPTION_DISABLE_NO_ISOLATION + 1) +#define OPTION_DISABLE_NO_BIND (OPTION_DISABLE_NO_SEH + 1) +#define OPTION_DISABLE_WDM_DRIVER (OPTION_DISABLE_NO_BIND + 1) +#define OPTION_DISABLE_TERMINAL_SERVER_AWARE \ + (OPTION_DISABLE_WDM_DRIVER + 1) static void gld${EMULATION_NAME}_add_options @@ -342,15 +356,24 @@ gld${EMULATION_NAME}_add_options {"enable-long-section-names", no_argument, NULL, OPTION_ENABLE_LONG_SECTION_NAMES}, {"disable-long-section-names", no_argument, NULL, OPTION_DISABLE_LONG_SECTION_NAMES}, {"dynamicbase",no_argument, NULL, OPTION_DYNAMIC_BASE}, + {"disable-dynamicbase",no_argument, NULL, OPTION_DISABLE_DYNAMIC_BASE}, {"forceinteg", no_argument, NULL, OPTION_FORCE_INTEGRITY}, + {"disable-forceinteg", no_argument, NULL, OPTION_DISABLE_FORCE_INTEGRITY}, {"nxcompat", no_argument, NULL, OPTION_NX_COMPAT}, + {"disable-nxcompat", no_argument, NULL, OPTION_DISABLE_NX_COMPAT}, {"no-isolation", no_argument, NULL, OPTION_NO_ISOLATION}, + {"disable-no-isolation", no_argument, NULL, OPTION_DISABLE_NO_ISOLATION}, {"no-seh", no_argument, NULL, OPTION_NO_SEH}, + {"disable-no-seh", no_argument, NULL, OPTION_DISABLE_NO_SEH}, {"no-bind", no_argument, NULL, OPTION_NO_BIND}, + {"disable-no-bind", no_argument, NULL, OPTION_DISABLE_NO_BIND}, {"wdmdriver", no_argument, NULL, OPTION_WDM_DRIVER}, + {"disable-wdmdriver", no_argument, NULL, OPTION_DISABLE_WDM_DRIVER}, {"tsaware", no_argument, NULL, OPTION_TERMINAL_SERVER_AWARE}, + {"disable-tsaware", no_argument, NULL, OPTION_DISABLE_TERMINAL_SERVER_AWARE}, {"build-id", optional_argument, NULL, OPTION_BUILD_ID}, {"enable-reloc-section", no_argument, NULL, OPTION_ENABLE_RELOC_SECTION}, + {"disable-reloc-section", no_argument, NULL, OPTION_DISABLE_RELOC_SECTION}, {NULL, no_argument, NULL, 0} }; @@ -414,7 +437,7 @@ static definfo init[] = D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000, FALSE), D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000, FALSE), D(LoaderFlags,"__loader_flags__", 0x0, FALSE), - D(DllCharacteristics, "__dll_characteristics__", 0x0, FALSE), + D(DllCharacteristics, "__dll_characteristics__", DEFAULT_DLL_CHARACTERISTICS, FALSE), { NULL, 0, 0, NULL, 0 , FALSE} }; @@ -483,18 +506,21 @@ gld_${EMULATION_NAME}_list_options (FILE *file) executable image files\n")); fprintf (file, _(" --disable-long-section-names Never use long COFF section names, even\n\ in object files\n")); - fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\ + fprintf (file, _(" --[disable-]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")); - fprintf (file, _(" --no-seh Image does not use SEH. No SE handler may\n\ + fprintf (file, _(" --disable-reloc-section Do not create the base relocation table\n")); + fprintf (file, _(" --[disable-]forceinteg Code integrity checks are enforced\n")); + fprintf (file, _(" --[disable-]nxcompat Image is compatible with data execution\n\ + prevention\n")); + fprintf (file, _(" --[disable-]no-isolation Image understands isolation but do not\n\ + isolate the image\n")); + fprintf (file, _(" --[disable-]no-seh Image does not use SEH. No SE handler may\n\ be called in this image\n")); - fprintf (file, _(" --no-bind Do not bind this image\n")); - fprintf (file, _(" --wdmdriver Driver uses the WDM model\n")); - fprintf (file, _(" --tsaware Image is Terminal Server aware\n")); - fprintf (file, _(" --build-id[=STYLE] Generate build ID\n")); + fprintf (file, _(" --[disable-]no-bind Do not bind this image\n")); + fprintf (file, _(" --[disable-]wdmdriver Driver uses the WDM model\n")); + fprintf (file, _(" --[disable-]tsaware Image is Terminal Server aware\n")); + fprintf (file, _(" --build-id[=STYLE] Generate build ID\n")); } @@ -862,27 +888,54 @@ gld${EMULATION_NAME}_handle_option (int optc) case OPTION_ENABLE_RELOC_SECTION: pe_dll_enable_reloc_section = 1; break; + case OPTION_DISABLE_RELOC_SECTION: + pe_dll_enable_reloc_section = 0; + /* fall through */ + case OPTION_DISABLE_DYNAMIC_BASE: + pe_dll_characteristics &= ~ IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE; + break; case OPTION_FORCE_INTEGRITY: pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY; break; + case OPTION_DISABLE_FORCE_INTEGRITY: + pe_dll_characteristics &= ~ IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY; + break; case OPTION_NX_COMPAT: pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_NX_COMPAT; break; + case OPTION_DISABLE_NX_COMPAT: + pe_dll_characteristics &= ~ IMAGE_DLL_CHARACTERISTICS_NX_COMPAT; + break; case OPTION_NO_ISOLATION: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_ISOLATION; break; + case OPTION_DISABLE_NO_ISOLATION: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_NO_ISOLATION; + break; case OPTION_NO_SEH: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_SEH; break; + case OPTION_DISABLE_NO_SEH: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_NO_SEH; + break; case OPTION_NO_BIND: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_BIND; break; + case OPTION_DISABLE_NO_BIND: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_NO_BIND; + break; case OPTION_WDM_DRIVER: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_WDM_DRIVER; break; + case OPTION_DISABLE_WDM_DRIVER: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_WDM_DRIVER; + break; case OPTION_TERMINAL_SERVER_AWARE: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE; break; + case OPTION_DISABLE_TERMINAL_SERVER_AWARE: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE; + break; case OPTION_BUILD_ID: free ((char *) emit_build_id); emit_build_id = NULL; diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index a0a7023..7d93951 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -99,24 +99,28 @@ fragment <<EOF #define DLL_SUPPORT #endif +#define DEFAULT_DLL_CHARACTERISTICS (IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE \ + | IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA \ + | IMAGE_DLL_CHARACTERISTICS_NX_COMPAT) + #if defined(TARGET_IS_i386pep) || ! defined(DLL_SUPPORT) #define PE_DEF_SUBSYSTEM 3 #undef NT_EXE_IMAGE_BASE #define NT_EXE_IMAGE_BASE \ ((bfd_vma) (${move_default_addr_high} ? 0x100400000LL \ - : 0x400000LL)) + : 0x140000000LL)) #undef NT_DLL_IMAGE_BASE #define NT_DLL_IMAGE_BASE \ ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \ - : 0x10000000LL)) + : 0x180000000LL)) #undef NT_DLL_AUTO_IMAGE_BASE #define NT_DLL_AUTO_IMAGE_BASE \ ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \ - : 0x61300000LL)) + : 0x1C0000000LL)) #undef NT_DLL_AUTO_IMAGE_MASK #define NT_DLL_AUTO_IMAGE_MASK \ ((bfd_vma) (${move_default_addr_high} ? 0x1ffff0000LL \ - : 0x0ffc0000LL)) + : 0x1ffff0000LL)) #else #undef NT_EXE_IMAGE_BASE #define NT_EXE_IMAGE_BASE \ @@ -147,7 +151,7 @@ static int pep_subsystem = ${SUBSYSTEM}; static flagword real_flags = IMAGE_FILE_LARGE_ADDRESS_AWARE; static int support_old_code = 0; static lang_assignment_statement_type *image_base_statement = 0; -static unsigned short pe_dll_characteristics = 0; +static unsigned short pe_dll_characteristics = DEFAULT_DLL_CHARACTERISTICS; static bfd_boolean insert_timestamp = TRUE; static const char *emit_build_id; @@ -248,7 +252,17 @@ enum options OPTION_NO_INSERT_TIMESTAMP, OPTION_TERMINAL_SERVER_AWARE, OPTION_BUILD_ID, - OPTION_ENABLE_RELOC_SECTION + OPTION_ENABLE_RELOC_SECTION, + OPTION_DISABLE_RELOC_SECTION, + OPTION_DISABLE_HIGH_ENTROPY_VA, + OPTION_DISABLE_DYNAMIC_BASE, + OPTION_DISABLE_FORCE_INTEGRITY, + OPTION_DISABLE_NX_COMPAT, + OPTION_DISABLE_NO_ISOLATION, + OPTION_DISABLE_NO_SEH, + OPTION_DISABLE_NO_BIND, + OPTION_DISABLE_WDM_DRIVER, + OPTION_DISABLE_TERMINAL_SERVER_AWARE }; static void @@ -327,6 +341,16 @@ gld${EMULATION_NAME}_add_options {"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}, + {"disable-reloc-section", no_argument, NULL, OPTION_DISABLE_RELOC_SECTION}, + {"disable-high-entropy-va", no_argument, NULL, OPTION_DISABLE_HIGH_ENTROPY_VA}, + {"disable-dynamicbase",no_argument, NULL, OPTION_DISABLE_DYNAMIC_BASE}, + {"disable-forceinteg", no_argument, NULL, OPTION_DISABLE_FORCE_INTEGRITY}, + {"disable-nxcompat", no_argument, NULL, OPTION_DISABLE_NX_COMPAT}, + {"disable-no-isolation", no_argument, NULL, OPTION_DISABLE_NO_ISOLATION}, + {"disable-no-seh", no_argument, NULL, OPTION_DISABLE_NO_SEH}, + {"disable-no-bind", no_argument, NULL, OPTION_DISABLE_NO_BIND}, + {"disable-wdmdriver", no_argument, NULL, OPTION_DISABLE_WDM_DRIVER}, + {"disable-tsaware", no_argument, NULL, OPTION_DISABLE_TERMINAL_SERVER_AWARE}, {NULL, no_argument, NULL, 0} }; @@ -384,7 +408,7 @@ static definfo init[] = D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000, FALSE), D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000, FALSE), D(LoaderFlags,"__loader_flags__", 0x0, FALSE), - D(DllCharacteristics, "__dll_characteristics__", 0x0, FALSE), + D(DllCharacteristics, "__dll_characteristics__", DEFAULT_DLL_CHARACTERISTICS, FALSE), { NULL, 0, 0, NULL, 0, FALSE} }; @@ -446,20 +470,23 @@ gld_${EMULATION_NAME}_list_options (FILE *file) executable image files\n")); fprintf (file, _(" --disable-long-section-names Never use long COFF section names, even\n\ in object files\n")); - fprintf (file, _(" --high-entropy-va Image is compatible with 64-bit address space\n\ + fprintf (file, _(" --[disable-]high-entropy-va Image is compatible with 64-bit address space\n\ layout randomization (ASLR)\n")); - fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\ + fprintf (file, _(" --[disable-]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")); - fprintf (file, _(" --no-seh Image does not use SEH; no SE handler may\n\ + fprintf (file, _(" --disable-reloc-section Do not create the base relocation table\n")); + fprintf (file, _(" --[disable-]forceinteg Code integrity checks are enforced\n")); + fprintf (file, _(" --[disable-]nxcompat Image is compatible with data execution\n\ + prevention\n")); + fprintf (file, _(" --[disable-]no-isolation Image understands isolation but do not\n\ + isolate the image\n")); + fprintf (file, _(" --[disable-]no-seh Image does not use SEH; no SE handler may\n\ be called in this image\n")); - fprintf (file, _(" --no-bind Do not bind this image\n")); - fprintf (file, _(" --wdmdriver Driver uses the WDM model\n")); - fprintf (file, _(" --tsaware Image is Terminal Server aware\n")); - fprintf (file, _(" --build-id[=STYLE] Generate build ID\n")); + fprintf (file, _(" --[disable-]no-bind Do not bind this image\n")); + fprintf (file, _(" --[disable-]wdmdriver Driver uses the WDM model\n")); + fprintf (file, _(" --[disable-]tsaware Image is Terminal Server aware\n")); + fprintf (file, _(" --build-id[=STYLE] Generate build ID\n")); #endif } @@ -809,27 +836,57 @@ gld${EMULATION_NAME}_handle_option (int optc) case OPTION_ENABLE_RELOC_SECTION: pep_dll_enable_reloc_section = 1; break; + case OPTION_DISABLE_RELOC_SECTION: + pep_dll_enable_reloc_section = 0; + /* fall through */ + case OPTION_DISABLE_DYNAMIC_BASE: + pe_dll_characteristics &= ~ IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE; + /* fall through */ + case OPTION_DISABLE_HIGH_ENTROPY_VA: + pe_dll_characteristics &= ~ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA; + break; case OPTION_FORCE_INTEGRITY: pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY; break; + case OPTION_DISABLE_FORCE_INTEGRITY: + pe_dll_characteristics &= ~ IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY; + break; case OPTION_NX_COMPAT: pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_NX_COMPAT; break; + case OPTION_DISABLE_NX_COMPAT: + pe_dll_characteristics &= ~ IMAGE_DLL_CHARACTERISTICS_NX_COMPAT; + break; case OPTION_NO_ISOLATION: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_ISOLATION; break; + case OPTION_DISABLE_NO_ISOLATION: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_NO_ISOLATION; + break; case OPTION_NO_SEH: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_SEH; break; + case OPTION_DISABLE_NO_SEH: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_NO_SEH; + break; case OPTION_NO_BIND: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_BIND; break; + case OPTION_DISABLE_NO_BIND: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_NO_BIND; + break; case OPTION_WDM_DRIVER: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_WDM_DRIVER; break; + case OPTION_DISABLE_WDM_DRIVER: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_WDM_DRIVER; + break; case OPTION_TERMINAL_SERVER_AWARE: pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE; break; + case OPTION_DISABLE_TERMINAL_SERVER_AWARE: + pe_dll_characteristics &= ~ IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE; + break; case OPTION_BUILD_ID: free ((char *) emit_build_id); emit_build_id = NULL; |