diff options
author | Rui Ueyama <ruiu@google.com> | 2015-06-16 23:13:00 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2015-06-16 23:13:00 +0000 |
commit | 6592ff8c93410d9f4560f3d4e8b744bcd6aceb04 (patch) | |
tree | 2dfb9543b6d6f6884653bf0e38a16c6e23bf9c5e | |
parent | f7d163a8ea60b8bc039deaa15842893611577718 (diff) | |
download | bcm5719-llvm-6592ff8c93410d9f4560f3d4e8b744bcd6aceb04.tar.gz bcm5719-llvm-6592ff8c93410d9f4560f3d4e8b744bcd6aceb04.zip |
COFF: Add miscellaneous boolean flags.
llvm-svn: 239864
-rw-r--r-- | lld/COFF/Config.h | 6 | ||||
-rw-r--r-- | lld/COFF/Driver.cpp | 16 | ||||
-rw-r--r-- | lld/COFF/Writer.cpp | 14 | ||||
-rw-r--r-- | lld/test/COFF/options.test | 51 |
4 files changed, 84 insertions, 3 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h index d40fdaaf271..9fe5777e865 100644 --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -51,6 +51,12 @@ public: uint32_t MinorImageVersion = 0; uint32_t MajorOSVersion = 6; uint32_t MinorOSVersion = 0; + bool DynamicBase = true; + bool HighEntropyVA = true; + bool AllowBind = true; + bool NxCompat = true; + bool AllowIsolation = true; + bool TerminalServerAware = true; }; extern Configuration *Config; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 8e74a655771..b739ca97e88 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -226,8 +226,14 @@ bool LinkerDriver::link(int Argc, const char *Argv[]) { Config->EntryName = Arg->getValue(); // Handle /fixed - if (Args->hasArg(OPT_fixed)) + if (Args->hasArg(OPT_fixed)) { + if (Args->hasArg(OPT_dynamicbase)) { + llvm::errs() << "/fixed must not be specified with /dynamicbase\n"; + return false; + } Config->Relocatable = false; + Config->DynamicBase = false; + } // Handle /machine auto MTOrErr = getMachineType(Args.get()); @@ -318,6 +324,14 @@ bool LinkerDriver::link(int Argc, const char *Argv[]) { return false; } + // Handle miscellaneous boolean flags. + if (Args->hasArg(OPT_allowbind_no)) Config->AllowBind = false; + if (Args->hasArg(OPT_allowisolation_no)) Config->AllowIsolation = false; + if (Args->hasArg(OPT_dynamicbase_no)) Config->DynamicBase = false; + if (Args->hasArg(OPT_highentropyva_no)) Config->HighEntropyVA = false; + if (Args->hasArg(OPT_nxcompat_no)) Config->NxCompat = false; + if (Args->hasArg(OPT_tsaware_no)) Config->TerminalServerAware = false; + // Create a list of input files. Files can be given as arguments // for /defaultlib option. std::vector<StringRef> InputPaths; diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 811e3b760e1..4e23677a005 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -270,8 +270,18 @@ void Writer::writeHeader() { PE->SizeOfStackCommit = Config->StackCommit; PE->SizeOfHeapReserve = Config->HeapReserve; PE->SizeOfHeapCommit = Config->HeapCommit; - if (Config->Relocatable) - PE->DLLCharacteristics = IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE; + if (Config->DynamicBase) + PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE; + if (Config->HighEntropyVA) + PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA; + if (!Config->AllowBind) + PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_BIND; + if (Config->NxCompat) + PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NX_COMPAT; + if (!Config->AllowIsolation) + PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION; + if (Config->TerminalServerAware) + PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE; PE->NumberOfRvaAndSize = NumberfOfDataDirectory; if (OutputSection *Text = findSection(".text")) { PE->BaseOfCode = Text->getRVA(); diff --git a/lld/test/COFF/options.test b/lld/test/COFF/options.test new file mode 100644 index 00000000000..dfd884b97ae --- /dev/null +++ b/lld/test/COFF/options.test @@ -0,0 +1,51 @@ +# RUN: yaml2obj < %p/Inputs/ret42.yaml > %t.obj + +# RUN: lld -flavor link /out:%t.exe %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=BIND %s +# RUN: lld -flavor link /allowbind /out:%t.exe %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=BIND %s +BIND-NOT: IMAGE_DLL_CHARACTERISTICS_NO_BIND + +# RUN: lld -flavor link /allowbind:no /out:%t.exe %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOBIND %s +NOBIND: IMAGE_DLL_CHARACTERISTICS_NO_BIND + +# RUN: lld -flavor link /out:%t.exe %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=ISO %s +# RUN: lld -flavor link /allowisolation /out:%t.exe %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=ISO %s +ISO-NOT: IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION + +# RUN: lld -flavor link /allowisolation:no /out:%t.exe %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOISO %s +NOISO: IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION + +# RUN: lld -flavor link /out:%t.exe %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=ENT %s +# RUN: lld -flavor link /highentropyva /out:%t.exe %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=ENT %s +ENT: IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA + +# RUN: lld -flavor link /highentropyva:no %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOENT %s +NOENT-NOT: IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA + +# RUN: lld -flavor link %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NXCOMPAT %s +# RUN: lld -flavor link /nxcompat %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NXCOMPAT %s +NXCOMPAT: IMAGE_DLL_CHARACTERISTICS_NX_COMPAT + +# RUN: lld -flavor link /nxcompat:no %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NONXCOMPAT %s +NONXCOMPAT-NOT: IMAGE_DLL_CHARACTERISTICS_NX_COMPAT + +# RUN: lld -flavor link %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=TSAWARE %s +# RUN: lld -flavor link /tsaware %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=TSAWARE %s +TSAWARE: IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE + +# RUN: lld -flavor link /tsaware:no %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOTSAWARE %s +NOTSAWARE-NOT: IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE |