forked from OSchip/llvm-project
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
This commit is contained in:
parent
ca5a16f131
commit
d657c25649
|
@ -194,6 +194,7 @@ struct Configuration {
|
||||||
bool WarnMissingOrderSymbol = true;
|
bool WarnMissingOrderSymbol = true;
|
||||||
bool WarnLocallyDefinedImported = true;
|
bool WarnLocallyDefinedImported = true;
|
||||||
bool Incremental = true;
|
bool Incremental = true;
|
||||||
|
bool IntegrityCheck = false;
|
||||||
bool KillAt = false;
|
bool KillAt = false;
|
||||||
bool Repro = false;
|
bool Repro = false;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1196,6 +1196,8 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
|
||||||
Args.hasFlag(OPT_incremental, OPT_incremental_no,
|
Args.hasFlag(OPT_incremental, OPT_incremental_no,
|
||||||
!Config->DoGC && !Config->DoICF && !Args.hasArg(OPT_order) &&
|
!Config->DoGC && !Config->DoICF && !Args.hasArg(OPT_order) &&
|
||||||
!Args.hasArg(OPT_profile));
|
!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->NxCompat = Args.hasFlag(OPT_nxcompat, OPT_nxcompat_no, true);
|
||||||
Config->TerminalServerAware =
|
Config->TerminalServerAware =
|
||||||
!Config->DLL && Args.hasFlag(OPT_tsaware, OPT_tsaware_no, true);
|
!Config->DLL && Args.hasFlag(OPT_tsaware, OPT_tsaware_no, true);
|
||||||
|
|
|
@ -117,7 +117,10 @@ defm highentropyva : B<"highentropyva",
|
||||||
"Disable 64-bit ASLR">;
|
"Disable 64-bit ASLR">;
|
||||||
defm incremental : B<"incremental",
|
defm incremental : B<"incremental",
|
||||||
"Keep original import library if contents are unchanged",
|
"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",
|
defm largeaddressaware : B<"largeaddressaware",
|
||||||
"Enable large addresses (default on 64-bit)",
|
"Enable large addresses (default on 64-bit)",
|
||||||
"Disable large addresses (default on 32-bit)">;
|
"Disable large addresses (default on 32-bit)">;
|
||||||
|
|
|
@ -849,6 +849,8 @@ template <typename PEHeaderTy> void Writer::writeHeader() {
|
||||||
PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION;
|
PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION;
|
||||||
if (Config->GuardCF != GuardCFLevel::Off)
|
if (Config->GuardCF != GuardCFLevel::Off)
|
||||||
PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_GUARD_CF;
|
PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_GUARD_CF;
|
||||||
|
if (Config->IntegrityCheck)
|
||||||
|
PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY;
|
||||||
if (SetNoSEHCharacteristic)
|
if (SetNoSEHCharacteristic)
|
||||||
PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_SEH;
|
PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_SEH;
|
||||||
if (Config->TerminalServerAware)
|
if (Config->TerminalServerAware)
|
||||||
|
|
|
@ -30,6 +30,16 @@ ENT: IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA
|
||||||
# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOENT %s
|
# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOENT %s
|
||||||
NOENT-NOT: IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA
|
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: lld-link /out:%t.exe /entry:main %t.obj
|
||||||
# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NXCOMPAT %s
|
# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NXCOMPAT %s
|
||||||
# RUN: lld-link /out:%t.exe /entry:main /nxcompat %t.obj
|
# RUN: lld-link /out:%t.exe /entry:main /nxcompat %t.obj
|
||||||
|
|
Loading…
Reference in New Issue