[lld][elf2] Fix hard coded entry address.

llvm-svn: 247089
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index e66a399..e622972 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -17,7 +17,7 @@
 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 @@
 }
 
 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 8feed75..356c9e4 100644
--- a/lld/ELF/SymbolTable.h
+++ b/lld/ELF/SymbolTable.h
@@ -54,6 +54,10 @@
     return SharedFiles;
   }
 
+  SymbolBody *getEntrySym() const {
+    return EntrySym;
+  }
+
 private:
   Symbol *insert(SymbolBody *New);
   template <class ELFT> void addELFFile(ELFFileBase *File);
@@ -73,6 +77,8 @@
   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 c3a7242..10dd162 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -577,7 +577,8 @@
   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 f696f8e..384bc46 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 @@
 # 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 @@
 # 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 151b83b..7194871 100644
--- a/lld/test/elf2/basic32.s
+++ b/lld/test/elf2/basic32.s
@@ -23,7 +23,7 @@
 # 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 8fecb96..149ab18 100644
--- a/lld/test/elf2/basic32be.s
+++ b/lld/test/elf2/basic32be.s
@@ -23,7 +23,7 @@
 # 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 6a0a442..5fcf3f2 100644
--- a/lld/test/elf2/basic64be.s
+++ b/lld/test/elf2/basic64be.s
@@ -28,7 +28,7 @@
 # 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)