[lld] r199234 - [Mips] Set default base address for MIPS executables to 0x400000. Assign
Simon Atanasyan
simon at atanasyan.com
Tue Jan 14 10:19:12 PST 2014
Author: atanasyan
Date: Tue Jan 14 12:19:12 2014
New Revision: 199234
URL: http://llvm.org/viewvc/llvm-project?rev=199234&view=rev
Log:
[Mips] Set default base address for MIPS executables to 0x400000. Assign
the lowest segment address to the MIPS_BASE_ADDRESS dynamic tag.
Added:
lld/trunk/test/elf/Mips/base-address.test
Modified:
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp?rev=199234&r1=199233&r2=199234&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp Tue Jan 14 12:19:12 2014
@@ -34,6 +34,18 @@ bool MipsLinkingContext::isLittleEndian(
return Mips32ElELFType::TargetEndianness == llvm::support::little;
}
+uint64_t MipsLinkingContext::getBaseAddress() const {
+ if (_baseAddress == 0 && getOutputELFType() == llvm::ELF::ET_EXEC)
+ return 0x400000;
+ return _baseAddress;
+}
+
+StringRef MipsLinkingContext::entrySymbolName() const {
+ if (_outputELFType == elf::ET_EXEC && _entrySymbolName.empty())
+ return "__start";
+ return _entrySymbolName;
+}
+
void MipsLinkingContext::addPasses(PassManager &pm) {
auto pass = createMipsRelocationPass(*this);
if (pass)
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h?rev=199234&r1=199233&r2=199234&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h Tue Jan 14 12:19:12 2014
@@ -35,6 +35,8 @@ public:
// ELFLinkingContext
virtual bool isLittleEndian() const;
+ virtual uint64_t getBaseAddress() const;
+ virtual StringRef entrySymbolName() const;
virtual void addPasses(PassManager &pm);
};
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp?rev=199234&r1=199233&r2=199234&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp Tue Jan 14 12:19:12 2014
@@ -64,7 +64,7 @@ public:
// The base address of the segment.
dyn.d_un.d_ptr = 0;
dyn.d_tag = DT_MIPS_BASE_ADDRESS;
- addEntry(dyn);
+ _dt_baseaddr = addEntry(dyn);
// Number of local global offset table entries.
dyn.d_un.d_val = 0;
@@ -91,6 +91,13 @@ public:
virtual void updateDynamicTable() {
DynamicTable<Mips32ElELFType>::updateDynamicTable();
+ // Assign the minimum segment address to the DT_MIPS_BASE_ADDRESS tag.
+ auto baseAddr = std::numeric_limits<uint64_t>::max();
+ for (auto si : _layout.segments())
+ if (si->segmentType() != llvm::ELF::PT_NULL)
+ baseAddr = std::min(baseAddr, si->virtualAddr());
+ _entries[_dt_baseaddr].d_un.d_val = baseAddr;
+
auto &got = _layout.getGOTSection();
_entries[_dt_symtabno].d_un.d_val = getSymbolTable()->size();
@@ -108,6 +115,7 @@ private:
std::size_t _dt_localgot;
std::size_t _dt_gotsym;
std::size_t _dt_pltgot;
+ std::size_t _dt_baseaddr;
};
}
Added: lld/trunk/test/elf/Mips/base-address.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/base-address.test?rev=199234&view=auto
==============================================================================
--- lld/trunk/test/elf/Mips/base-address.test (added)
+++ lld/trunk/test/elf/Mips/base-address.test Tue Jan 14 12:19:12 2014
@@ -0,0 +1,65 @@
+# Check executable base address configuration. Base address should be
+# equal to 0x400000 and the MIPS_BASE_ADDRESS dynamic tag's value should
+# be the same.
+# RUN: llvm-mc -triple=mipsel -filetype=obj -o=%t1 %s
+# RUN: lld -flavor gnu -target mipsel --noinhibit-exec -o %t2 %t1
+# RUN: llvm-readobj -dynamic-table -program-headers %t2 | FileCheck %s
+
+# CHECK: DynamicSection [ (15 entries)
+# CHECK: Tag Type Name/Value
+# CHECK: 0x00000004 HASH 0x400110
+# CHECK: 0x00000005 STRTAB 0x400130
+# CHECK: 0x00000006 SYMTAB 0x400120
+# CHECK: 0x0000000A STRSZ 1 (bytes)
+# CHECK: 0x0000000B SYMENT 16 (bytes)
+# CHECK: 0x0000001A FINI_ARRAY 0x0
+# CHECK: 0x0000001C FINI_ARRAYSZ 0 (bytes)
+# CHECK: 0x70000001 MIPS_RLD_VERSION 1
+# CHECK: 0x70000005 MIPS_FLAGS 0x2
+# CHECK: 0x70000006 MIPS_BASE_ADDRESS 0x400000
+# CHECK: 0x7000000A MIPS_LOCAL_GOTNO 2
+# CHECK: 0x70000011 MIPS_SYMTABNO 1
+# CHECK: 0x70000013 MIPS_GOTSYM 0x1
+# CHECK: 0x00000003 PLTGOT 0x401000
+# CHECK: 0x00000000 NULL 0x0
+# CHECK: ]
+
+# CHECK: ProgramHeaders [
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_PHDR (0x6)
+# CHECK: Offset: 0x34
+# CHECK: VirtualAddress: 0x400034
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_INTERP (0x3)
+# CHECK: Offset: 0xF4
+# CHECK: VirtualAddress: 0x4000F4
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_LOAD (0x1)
+# CHECK: Offset: 0x0
+# CHECK: VirtualAddress: 0x400000
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_LOAD (0x1)
+# CHECK: Offset: 0x1000
+# CHECK: VirtualAddress: 0x401000
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_LOAD (0x1)
+# CHECK: Offset: 0x2000
+# CHECK: VirtualAddress: 0x402000
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_DYNAMIC (0x2)
+# CHECK: Offset: 0x138
+# CHECK: VirtualAddress: 0x400138
+# CHECK: }
+# CHECK: ]
+
+ .global main
+ .ent main
+main:
+ nop
+ .end main
+
More information about the llvm-commits
mailing list