diff options
| author | Rui Ueyama <ruiu@google.com> | 2014-01-31 04:49:13 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2014-01-31 04:49:13 +0000 |
| commit | ea7e9306c15ff0ae702544d06339cc986eeee490 (patch) | |
| tree | b265e06bd3c49b591a0ca81689403914a83f1c92 | |
| parent | 286d1b929d6e1c868f38cbe590ee30b3b7bd5d88 (diff) | |
| download | bcm5719-llvm-ea7e9306c15ff0ae702544d06339cc986eeee490.tar.gz bcm5719-llvm-ea7e9306c15ff0ae702544d06339cc986eeee490.zip | |
[PECOFF] Default image base address for PE32+ is 0x140000000, not 0x400000.
llvm-svn: 200511
| -rw-r--r-- | lld/include/lld/ReaderWriter/PECOFFLinkingContext.h | 10 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp | 11 | ||||
| -rw-r--r-- | lld/test/pecoff/pe32plus.test | 2 |
3 files changed, 15 insertions, 8 deletions
diff --git a/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h b/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h index 7c9879c38e6..7de6f6d6cba 100644 --- a/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h +++ b/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h @@ -35,9 +35,9 @@ class Group; class PECOFFLinkingContext : public LinkingContext { public: PECOFFLinkingContext() - : _baseAddress(0x400000), _stackReserve(1024 * 1024), _stackCommit(4096), - _heapReserve(1024 * 1024), _heapCommit(4096), _noDefaultLibAll(false), - _sectionDefaultAlignment(4096), + : _baseAddress(invalidBaseAddress), _stackReserve(1024 * 1024), + _stackCommit(4096), _heapReserve(1024 * 1024), _heapCommit(4096), + _noDefaultLibAll(false), _sectionDefaultAlignment(4096), _subsystem(llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN), _machineType(llvm::COFF::IMAGE_FILE_MACHINE_I386), _imageVersion(0, 0), _minOSVersion(6, 0), _nxCompat(true), _largeAddressAware(false), @@ -108,7 +108,7 @@ public: } void setBaseAddress(uint64_t addr) { _baseAddress = addr; } - uint64_t getBaseAddress() const { return _baseAddress; } + uint64_t getBaseAddress() const; void setStackReserve(uint64_t size) { _stackReserve = size; } void setStackCommit(uint64_t size) { _stackCommit = size; } @@ -250,6 +250,8 @@ protected: virtual std::unique_ptr<File> createUndefinedSymbolFile() const; private: + enum { invalidBaseAddress = UINT64_MAX }; + // The start address for the program. The default value for the executable is // 0x400000, but can be altered using /base command line option. uint64_t _baseAddress; diff --git a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp index 9c929db6d3b..067fd5ccd24 100644 --- a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp +++ b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp @@ -48,9 +48,9 @@ bool PECOFFLinkingContext::validateImpl(raw_ostream &diagnostics) { } // It's an error if the base address is not multiple of 64K. - if (_baseAddress & 0xffff) { + if (getBaseAddress() & 0xffff) { diagnostics << "Base address have to be multiple of 64K, but got " - << _baseAddress << "\n"; + << getBaseAddress() << "\n"; return false; } @@ -201,8 +201,13 @@ StringRef PECOFFLinkingContext::undecorateSymbol(StringRef name) const { return name.substr(1); } -Writer &PECOFFLinkingContext::writer() const { return *_writer; } +uint64_t PECOFFLinkingContext::getBaseAddress() const { + if (_baseAddress == invalidBaseAddress) + return is64Bit() ? 0x140000000UL : 0x400000UL; + return _baseAddress; +} +Writer &PECOFFLinkingContext::writer() const { return *_writer; } void PECOFFLinkingContext::setSectionSetMask(StringRef sectionName, uint32_t newFlags) { diff --git a/lld/test/pecoff/pe32plus.test b/lld/test/pecoff/pe32plus.test index 461bb534d38..6d6bf2fda21 100644 --- a/lld/test/pecoff/pe32plus.test +++ b/lld/test/pecoff/pe32plus.test @@ -27,7 +27,7 @@ CHECK-NEXT: SizeOfInitializedData: 108 CHECK-NEXT: SizeOfUninitializedData: 0 CHECK-NEXT: AddressOfEntryPoint: 0x2000 CHECK-NEXT: BaseOfCode: 0x2000 -CHECK-NEXT: ImageBase: 0x400000 +CHECK-NEXT: ImageBase: 0x140000000 CHECK-NEXT: SectionAlignment: 4096 CHECK-NEXT: FileAlignment: 512 CHECK-NEXT: MajorOperatingSystemVersion: 6 |

