summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/Config.h1
-rw-r--r--lld/COFF/Driver.cpp2
-rw-r--r--lld/COFF/Options.td5
-rw-r--r--lld/COFF/Writer.cpp2
-rw-r--r--lld/test/COFF/options.test10
5 files changed, 19 insertions, 1 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h
index e6f9b513fed..3ccccb61e7b 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 d0bd2b03ad5..64a7d7296c4 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -1196,6 +1196,8 @@ void LinkerDriver::link(ArrayRef<const char *> 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 a6ef2ff24e6..9051b0ba039 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 857067178f9..dff87c5009f 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -849,6 +849,8 @@ template <typename PEHeaderTy> 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 50f921cdb87..6b9f2ca06fa 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
OpenPOWER on IntegriCloud