summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael J. Spencer <bigcheesegs@gmail.com>2015-09-08 22:34:57 +0000
committerMichael J. Spencer <bigcheesegs@gmail.com>2015-09-08 22:34:57 +0000
commit546c64c733dd040f905d76e00deb8b07419f560d (patch)
treeec7b42995461592ef4c20309495f6fd387b2a46c
parent07f3af2e82ef9178fa2251552200850efc1aeea6 (diff)
downloadbcm5719-llvm-546c64c733dd040f905d76e00deb8b07419f560d.tar.gz
bcm5719-llvm-546c64c733dd040f905d76e00deb8b07419f560d.zip
[lld][elf2] Fix hard coded entry address.
llvm-svn: 247089
-rw-r--r--lld/ELF/SymbolTable.cpp8
-rw-r--r--lld/ELF/SymbolTable.h6
-rw-r--r--lld/ELF/Writer.cpp3
-rw-r--r--lld/test/elf2/basic.s25
-rw-r--r--lld/test/elf2/basic32.s2
-rw-r--r--lld/test/elf2/basic32be.s2
-rw-r--r--lld/test/elf2/basic64be.s2
7 files changed, 39 insertions, 9 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index e66a399084e..e62297271ed 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -17,7 +17,7 @@ using namespace llvm::object;
using namespace lld;
using namespace lld::elf2;
-SymbolTable::SymbolTable() {
+SymbolTable::SymbolTable() : EntrySym(nullptr) {
}
void SymbolTable::addFile(std::unique_ptr<InputFile> File) {
@@ -33,8 +33,10 @@ void SymbolTable::addFile(std::unique_ptr<InputFile> File) {
}
template <class ELFT> void SymbolTable::init() {
- resolve<ELFT>(new (Alloc)
- Undefined<ELFT>("_start", Undefined<ELFT>::Synthetic));
+ if (EntrySym)
+ return;
+ EntrySym = new (Alloc) Undefined<ELFT>("_start", Undefined<ELFT>::Synthetic);
+ resolve<ELFT>(EntrySym);
}
template <class ELFT> void SymbolTable::addELFFile(ELFFileBase *File) {
diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h
index 8feed75ea1f..356c9e40cca 100644
--- a/lld/ELF/SymbolTable.h
+++ b/lld/ELF/SymbolTable.h
@@ -54,6 +54,10 @@ public:
return SharedFiles;
}
+ SymbolBody *getEntrySym() const {
+ return EntrySym;
+ }
+
private:
Symbol *insert(SymbolBody *New);
template <class ELFT> void addELFFile(ELFFileBase *File);
@@ -73,6 +77,8 @@ private:
std::vector<std::unique_ptr<ObjectFileBase>> ObjectFiles;
std::vector<std::unique_ptr<SharedFileBase>> SharedFiles;
+
+ SymbolBody *EntrySym;
};
} // namespace elf2
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index c3a7242bbab..10dd162463c 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -577,7 +577,8 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
auto &FirstObj = cast<ObjectFile<ELFT>>(*Symtab.getFirstELF());
EHdr->e_machine = FirstObj.getEMachine();
EHdr->e_version = EV_CURRENT;
- EHdr->e_entry = 0x401000;
+ EHdr->e_entry = getSymVA(
+ cast<DefinedRegular<ELFT>>(Symtab.getEntrySym()->getReplacement()));
EHdr->e_phoff = sizeof(Elf_Ehdr);
EHdr->e_shoff = SectionHeaderOff;
EHdr->e_ehsize = sizeof(Elf_Ehdr);
diff --git a/lld/test/elf2/basic.s b/lld/test/elf2/basic.s
index f696f8ec6a4..384bc466f03 100644
--- a/lld/test/elf2/basic.s
+++ b/lld/test/elf2/basic.s
@@ -1,6 +1,7 @@
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
# RUN: lld -flavor gnu2 %t -o %t2
-# RUN: llvm-readobj -file-headers -sections -program-headers %t2 | FileCheck %s
+# RUN: llvm-readobj -file-headers -sections -program-headers -symbols %t2 \
+# RUN: | FileCheck %s
# REQUIRES: x86
# exits with return code 42 on linux
@@ -23,7 +24,7 @@ _start:
# CHECK-NEXT: Type: Executable (0x2)
# CHECK-NEXT: Machine: EM_X86_64 (0x3E)
# CHECK-NEXT: Version: 1
-# CHECK-NEXT: Entry: 0x401000
+# CHECK-NEXT: Entry: [[ENTRY:0x[0-9A-F]+]]
# CHECK-NEXT: ProgramHeaderOffset: 0x40
# CHECK-NEXT: SectionHeaderOffset: 0x1070
# CHECK-NEXT: Flags [ (0x0)
@@ -127,6 +128,26 @@ _start:
# CHECK-NEXT: EntrySize: 0
# CHECK-NEXT: }
# CHECK-NEXT: ]
+# CHECK-NEXT: Symbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _start (7)
+# CHECK-NEXT: Value: [[ENTRY]]
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text (0x1)
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
# CHECK-NEXT: ProgramHeaders [
# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD (0x1)
diff --git a/lld/test/elf2/basic32.s b/lld/test/elf2/basic32.s
index 151b83ba840..719487124bb 100644
--- a/lld/test/elf2/basic32.s
+++ b/lld/test/elf2/basic32.s
@@ -23,7 +23,7 @@ _start:
# CHECK-NEXT: Type: Executable (0x2)
# CHECK-NEXT: Machine: EM_386 (0x3)
# CHECK-NEXT: Version: 1
-# CHECK-NEXT: Entry: 0x401000
+# CHECK-NEXT: Entry: 0x1000
# CHECK-NEXT: ProgramHeaderOffset: 0x34
# CHECK-NEXT: SectionHeaderOffset: 0x1058
# CHECK-NEXT: Flags [ (0x0)
diff --git a/lld/test/elf2/basic32be.s b/lld/test/elf2/basic32be.s
index 8fecb968458..149ab18618e 100644
--- a/lld/test/elf2/basic32be.s
+++ b/lld/test/elf2/basic32be.s
@@ -23,7 +23,7 @@ _start:
# CHECK-NEXT: Type: Executable (0x2)
# CHECK-NEXT: Machine: EM_PPC (0x14)
# CHECK-NEXT: Version: 1
-# CHECK-NEXT: Entry: 0x401000
+# CHECK-NEXT: Entry: 0x1000
# CHECK-NEXT: ProgramHeaderOffset: 0x34
# CHECK-NEXT: SectionHeaderOffset: 0x1058
# CHECK-NEXT: Flags [ (0x0)
diff --git a/lld/test/elf2/basic64be.s b/lld/test/elf2/basic64be.s
index 6a0a442fe17..5fcf3f2f73c 100644
--- a/lld/test/elf2/basic64be.s
+++ b/lld/test/elf2/basic64be.s
@@ -28,7 +28,7 @@ _start:
# CHECK-NEXT: Type: Executable (0x2)
# CHECK-NEXT: Machine: EM_PPC64 (0x15)
# CHECK-NEXT: Version: 1
-# CHECK-NEXT: Entry: 0x401000
+# CHECK-NEXT: Entry: 0x100C
# CHECK-NEXT: ProgramHeaderOffset: 0x40
# CHECK-NEXT: SectionHeaderOffset: 0x1088
# CHECK-NEXT: Flags [ (0x0)
OpenPOWER on IntegriCloud