diff options
author | Rui Ueyama <ruiu@google.com> | 2015-07-03 03:02:19 +0300 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2015-07-03 03:02:19 +0300 |
commit | 49d6cd35ad2e6686236ae3fd9891104569e50e6e (patch) | |
tree | 6db7fb12fb58a3a0bb2e8beeb3103f061370a83b /lld | |
parent | 754eb7c5639e5c133b66d9806089d9dcf9650e04 (diff) |
COFF: Fix /base option.
Previously, __ImageBase symbol got a different value than the one
specified by /base:<number> because the symbol was created in the
SymbolTable's constructor. When the constructor is called,
no command line options are processed yet, so the symbol was
created always with the initial value. This caused wrong relocations
and thus caused mysterious crashes of some executables linked by LLD.
llvm-svn: 241313
Diffstat (limited to 'lld')
-rw-r--r-- | lld/COFF/Config.h | 2 | ||||
-rw-r--r-- | lld/COFF/Driver.cpp | 3 | ||||
-rw-r--r-- | lld/COFF/SymbolTable.cpp | 8 | ||||
-rw-r--r-- | lld/COFF/SymbolTable.h | 2 | ||||
-rw-r--r-- | lld/test/COFF/base.test | 56 |
5 files changed, 60 insertions, 11 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h index fd57019dbc9b..75a92c0cf079 100644 --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -79,7 +79,7 @@ struct Configuration { // Used for /alternatename. std::map<StringRef, StringRef> AlternateNames; - uint64_t ImageBase = 0x140000000; + uint64_t ImageBase = 0x140000000U; uint64_t StackReserve = 1024 * 1024; uint64_t StackCommit = 4096; uint64_t HeapReserve = 1024 * 1024; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index e9be0759e139..8252cad6b96f 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -302,6 +302,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) { // Handle /dll if (Args.hasArg(OPT_dll)) { Config->DLL = true; + Config->ImageBase = 0x180000000U; Config->ManifestID = 2; if (Config->Entry == nullptr && !Config->NoEntry) Config->Entry = addUndefined("_DllMainCRTStartup"); @@ -526,6 +527,8 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) { OwningMBs.push_back(std::move(MB)); // take ownership } + Symtab.addAbsolute("__ImageBase", Config->ImageBase); + // Read all input files given via the command line. Note that step() // doesn't read files that are specified by directive sections. for (MemoryBufferRef MB : Inputs) diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index 832c5f05cfff..4a08c49757c6 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -23,10 +23,6 @@ using namespace llvm; namespace lld { namespace coff { -SymbolTable::SymbolTable() { - addSymbol(new (Alloc) DefinedAbsolute("__ImageBase", Config->ImageBase)); -} - void SymbolTable::addFile(std::unique_ptr<InputFile> FileP) { InputFile *File = FileP.get(); Files.push_back(std::move(FileP)); @@ -279,6 +275,10 @@ Undefined *SymbolTable::addUndefined(StringRef Name) { return New; } +void SymbolTable::addAbsolute(StringRef Name, uint64_t VA) { + addSymbol(new (Alloc) DefinedAbsolute(Name, VA)); +} + void SymbolTable::printMap(llvm::raw_ostream &OS) { for (ObjectFile *File : ObjectFiles) { OS << File->getShortName() << ":\n"; diff --git a/lld/COFF/SymbolTable.h b/lld/COFF/SymbolTable.h index 4b22f3d1451c..0341eb1a6b2e 100644 --- a/lld/COFF/SymbolTable.h +++ b/lld/COFF/SymbolTable.h @@ -41,7 +41,6 @@ struct Symbol; // to replace the lazy symbol. The logic is implemented in resolve(). class SymbolTable { public: - SymbolTable(); void addFile(std::unique_ptr<InputFile> File); std::error_code step(); std::error_code run(); @@ -79,6 +78,7 @@ public: // Creates an Undefined symbol for a given name. Undefined *addUndefined(StringRef Name); + void addAbsolute(StringRef Name, uint64_t VA); // A list of chunks which to be added to .rdata. std::vector<Chunk *> LocalImportChunks; diff --git a/lld/test/COFF/base.test b/lld/test/COFF/base.test index 7a34b8d1d041..177fe4fca9db 100644 --- a/lld/test/COFF/base.test +++ b/lld/test/COFF/base.test @@ -1,11 +1,57 @@ -# RUN: yaml2obj < %p/Inputs/ret42.yaml > %t.obj +# RUN: yaml2obj < %s > %t.obj # RUN: lld -flavor link2 /out:%t.exe /entry:main %t.obj -# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=DEFAULT %s +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=DEFAULT-HEADER %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=DEFAULT-TEXT %s -DEFAULT: ImageBase: 0x140000000 +# DEFAULT-HEADER: ImageBase: 0x140000000 +# DEFAULT-TEXT: Contents of section .text: +# DEFAULT-TEXT-NEXT: 1000 00000040 01000000 # RUN: lld -flavor link2 /out:%t.exe /entry:main %t.obj /base:0x280000000 -# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=BASE %s +# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=BASE-HEADER %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=BASE-TEXT %s -BASE: ImageBase: 0x280000000 +# BASE-HEADER: ImageBase: 0x280000000 +# BASE-TEXT: Contents of section .text: +# BASE-TEXT-NEXT: 1000 00000080 02000000 + +--- +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4096 + SectionData: 0000000000000000 + Relocations: + - VirtualAddress: 0 + SymbolName: __ImageBase + Type: IMAGE_REL_AMD64_ADDR64 +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 8 + NumberOfRelocations: 1 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 + - Name: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: __ImageBase + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +... |