From d657c2564980cb4ad763c49bf5181c1311824085 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Thu, 31 May 2018 13:43:02 +0000 Subject: [PATCH] lld-link: Implement /INTEGRITYCHECK flag /INTEGRITYCHECK has the effect of setting IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY. Fixes PR31066. https://reviews.llvm.org/D47472 llvm-svn: 333652 --- lld/COFF/Config.h | 1 + lld/COFF/Driver.cpp | 2 ++ lld/COFF/Options.td | 5 ++++- lld/COFF/Writer.cpp | 2 ++ lld/test/COFF/options.test | 10 ++++++++++ 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h index e6f9b513fedd..3ccccb61e7b7 100644 --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -194,6 +194,7 @@ struct Configuration { bool WarnMissingOrderSymbol = true; bool WarnLocallyDefinedImported = true; bool Incremental = true; + bool IntegrityCheck = false; bool KillAt = false; bool Repro = false; }; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index d0bd2b03ad58..64a7d7296c4b 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1196,6 +1196,8 @@ void LinkerDriver::link(ArrayRef ArgsArr) { Args.hasFlag(OPT_incremental, OPT_incremental_no, !Config->DoGC && !Config->DoICF && !Args.hasArg(OPT_order) && !Args.hasArg(OPT_profile)); + Config->IntegrityCheck = + Args.hasFlag(OPT_integritycheck, OPT_integritycheck_no, false); Config->NxCompat = Args.hasFlag(OPT_nxcompat, OPT_nxcompat_no, true); Config->TerminalServerAware = !Config->DLL && Args.hasFlag(OPT_tsaware, OPT_tsaware_no, true); diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td index a6ef2ff24e6d..9051b0ba0390 100644 --- a/lld/COFF/Options.td +++ b/lld/COFF/Options.td @@ -117,7 +117,10 @@ defm highentropyva : B<"highentropyva", "Disable 64-bit ASLR">; defm incremental : B<"incremental", "Keep original import library if contents are unchanged", - "Replace import library file even if contents are unchanged">; + "Overwrite import library even if contents are unchanged">; +defm integritycheck : B<"integritycheck", + "Set FORCE_INTEGRITY bit in PE header", + "No effect (default)">; defm largeaddressaware : B<"largeaddressaware", "Enable large addresses (default on 64-bit)", "Disable large addresses (default on 32-bit)">; diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 857067178f99..dff87c5009f8 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -849,6 +849,8 @@ template void Writer::writeHeader() { PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION; if (Config->GuardCF != GuardCFLevel::Off) PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_GUARD_CF; + if (Config->IntegrityCheck) + PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY; if (SetNoSEHCharacteristic) PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_SEH; if (Config->TerminalServerAware) diff --git a/lld/test/COFF/options.test b/lld/test/COFF/options.test index 50f921cdb879..6b9f2ca06fab 100644 --- a/lld/test/COFF/options.test +++ b/lld/test/COFF/options.test @@ -30,6 +30,16 @@ ENT: IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA # RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOENT %s NOENT-NOT: IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA +# RUN: lld-link /out:%t.exe /entry:main /integritycheck %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=INT %s +INT: IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY + +# RUN: lld-link /out:%t.exe /entry:main %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOINT %s +# RUN: lld-link /out:%t.exe /integritycheck:no /out:%t.exe /entry:main %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOINT %s +NOINT-NOT: IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY + # RUN: lld-link /out:%t.exe /entry:main %t.obj # RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NXCOMPAT %s # RUN: lld-link /out:%t.exe /entry:main /nxcompat %t.obj