diff options
-rw-r--r-- | lld/include/lld/ReaderWriter/ELFTargetInfo.h | 3 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/DefaultELFLayout.h | 2 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h | 6 | ||||
-rw-r--r-- | lld/test/elf/phdr.objtxt | 7 |
4 files changed, 16 insertions, 2 deletions
diff --git a/lld/include/lld/ReaderWriter/ELFTargetInfo.h b/lld/include/lld/ReaderWriter/ELFTargetInfo.h index 37874c00031..237bd4f221e 100644 --- a/lld/include/lld/ReaderWriter/ELFTargetInfo.h +++ b/lld/include/lld/ReaderWriter/ELFTargetInfo.h @@ -10,6 +10,7 @@ #ifndef LLD_READER_WRITER_ELF_TARGET_INFO_H #define LLD_READER_WRITER_ELF_TARGET_INFO_H +#include "lld/Core/LinkerOptions.h" #include "lld/Core/TargetInfo.h" #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" @@ -33,6 +34,8 @@ public: uint16_t getOutputType() const; uint16_t getOutputMachine() const; + virtual uint64_t getBaseAddress() const { return _options._baseAddress; } + static std::unique_ptr<ELFTargetInfo> create(const LinkerOptions &lo); template <typename ELFT> diff --git a/lld/lib/ReaderWriter/ELF/DefaultELFLayout.h b/lld/lib/ReaderWriter/ELF/DefaultELFLayout.h index 86e61ecc020..fb97a1d0c1d 100644 --- a/lld/lib/ReaderWriter/ELF/DefaultELFLayout.h +++ b/lld/lib/ReaderWriter/ELF/DefaultELFLayout.h @@ -518,7 +518,7 @@ DefaultELFLayout<ELFT>::assignVirtualAddress() { if (_segments.empty()) return; - uint64_t virtualAddress = _targetInfo.getLinkerOptions()._baseAddress; + uint64_t virtualAddress = _targetInfo.getBaseAddress(); // HACK: This is a super dirty hack. The elf header and program header are // not part of a section, but we need them to be loaded at the base address diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h index 4410d3bf1ba..9098d2066bb 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFTargetInfo.h @@ -30,6 +30,12 @@ public: virtual uint64_t getPageSize() const { return 0x1000; } + virtual uint64_t getBaseAddress() const { + if (_options._baseAddress == 0) + return 0x400000; + return _options._baseAddress; + } + }; } // elf } // lld diff --git a/lld/test/elf/phdr.objtxt b/lld/test/elf/phdr.objtxt index 79a4e42bc84..1956db3b920 100644 --- a/lld/test/elf/phdr.objtxt +++ b/lld/test/elf/phdr.objtxt @@ -1,4 +1,7 @@ -RUN: lld-core -reader ELF -writer ELF -o %t1 %p/Inputs/phdr.i386 | elf-dump %t1 | FileCheck -check-prefix=ED %s +RUN: lld-core -reader ELF -writer ELF -o %t1 %p/Inputs/phdr.i386 | elf-dump %t1 | FileCheck -check-prefix=ED %s + +RUN: lld -core -target x86_64-linux -output=%t1 %p/Inputs/relocs.x86-64 \ +RUN: && llvm-objdump -p %t1 | FileCheck %s -check-prefix=X86_64 ED: # Program Header 0 ED: (('p_type', 0x00000001) @@ -40,3 +43,5 @@ ED: ('p_filesz', 0x0000008c) ED: ('p_memsz', 0x0000008c) ED: ('p_align', 0x00001000) ED: ), + +X86_64: vaddr 0x0000000000400000 |