[ELF] Use entry point from LinkerOptions.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Mon, 28 Jan 2013 04:15:44 +0000 (04:15 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Mon, 28 Jan 2013 04:15:44 +0000 (04:15 +0000)
Patch by Ahmed Bougacha!

llvm-svn: 173655

lld/include/lld/ReaderWriter/ELFTargetInfo.h
lld/lib/Driver/Drivers.cpp
lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
lld/lib/ReaderWriter/ELF/WriterELF.cpp
lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp
lld/test/elf/entry.objtxt [new file with mode: 0644]
lld/tools/lld-core/lld-core.cpp

index 237bd4f221e98f719e170cf27c959875242712de..7914083f83c0678bcd4a82b3dacd4d5b22d6cedc 100644 (file)
@@ -34,6 +34,7 @@ public:
   uint16_t getOutputType() const;
   uint16_t getOutputMachine() const;
 
+  virtual StringRef getEntry() const;
   virtual uint64_t getBaseAddress() const { return _options._baseAddress; }
 
   static std::unique_ptr<ELFTargetInfo> create(const LinkerOptions &lo);
index d6c29ca175e98d5270d956b6edccad763df9bf25..00085e685f9344273cc65b342792a7ea94ffc57d 100644 (file)
@@ -124,9 +124,6 @@ public:
 
     if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_entry))
       newArgs->AddJoinedArg(A, _core.getOption(core::OPT_entry), A->getValue());
-    else
-      newArgs->AddJoinedArg(nullptr, _core.getOption(core::OPT_entry),
-                            "_start");
 
     if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_output))
       newArgs->AddJoinedArg(A, _core.getOption(core::OPT_output),
index cb398ebccc820363da38899046ab62ad8f6e78a5..ea0fd114c4aa18cef28b490ac8d260fbfdfaff0d 100644 (file)
@@ -68,4 +68,11 @@ std::unique_ptr<ELFTargetInfo> ELFTargetInfo::create(const LinkerOptions &lo) {
     return std::unique_ptr<ELFTargetInfo>();
   }
 }
+
+StringRef ELFTargetInfo::getEntry() const {
+  if (!_options._entrySymbol.empty())
+    return _options._entrySymbol;
+  return "_start";
+}
+
 } // end namespace lld
index f8d23c5fb26d2c925979aa708624893879d9d9d2..ecefa19b8b8f72686eb3dee6d9750daaa1ea6249 100644 (file)
@@ -149,7 +149,7 @@ void ELFExecutableWriter<ELFT>::assignSectionsWithNoSegments() {
 /// absolute symbols
 template<class ELFT>
 void ELFExecutableWriter<ELFT>::addDefaultAtoms() {
-  _runtimeFile.addUndefinedAtom("_start");
+  _runtimeFile.addUndefinedAtom(_targetInfo.getEntry());
   _runtimeFile.addAbsoluteAtom("__bss_start");
   _runtimeFile.addAbsoluteAtom("__bss_end");
   _runtimeFile.addAbsoluteAtom("_end");
@@ -268,7 +268,7 @@ ELFExecutableWriter<ELFT>::writeFile(const lld::File &file, StringRef path) {
   _elfHeader->e_shnum(_shdrtab->numHeaders());
   _elfHeader->e_shstrndx(_shstrtab->ordinal());
   uint64_t virtualAddr = 0;
-  _layout->findAtomAddrByName("_start", virtualAddr);
+  _layout->findAtomAddrByName(_targetInfo.getEntry(), virtualAddr);
   _elfHeader->e_entry(virtualAddr);
 
   // HACK: We have to write out the header and program header here even though
index fd5728d864d93e027ae1cb2ab39d36614369200a..621b6476af9474d4dbaadd193507c3c25c3037df 100644 (file)
@@ -70,8 +70,6 @@ public:
   virtual uint64_t getPageZeroSize() const { return getPageSize(); }
 
   virtual StringRef getEntry() const {
-    if (_options._outputKind != OutputKind::Executable)
-      return "";
     if (!_options._entrySymbol.empty())
       return _options._entrySymbol;
     return "_main";
diff --git a/lld/test/elf/entry.objtxt b/lld/test/elf/entry.objtxt
new file mode 100644 (file)
index 0000000..6349256
--- /dev/null
@@ -0,0 +1,57 @@
+# Tests entry point handling
+#
+# Test generated using the source file below:
+#
+#  int main()
+#  {
+#    return 0;
+#  }
+#
+
+# RUN: lld-core -reader YAML %s -writer ELF --entry=_entrypoint -o %t1
+# RUN: llvm-nm -n %t1 | FileCheck %s
+# 
+# CHECK:  000000a0 T main
+# CHECK:  00001000 A _end
+# CHECK:  00001000 A end
+# CHECK:           w _entrypoint
+
+defined-atoms:   
+  - name:            .text
+    alignment:       2^4
+    section-choice:  custom-required
+    section-name:    .text
+  - name:            main
+    scope:           global
+    content:         [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, 
+                       00, C3 ]
+    alignment:       2^4
+    section-choice:  custom-required
+    section-name:    .text
+  - name:            .data
+    type:            data
+    alignment:       2^2
+    section-choice:  custom-required
+    section-name:    .data
+  - name:            .bss
+    type:            zero-fill
+    alignment:       2^2
+    section-choice:  custom-required
+    section-name:    .bss
+  - name:            .note.GNU-stack
+    section-choice:  custom-required
+    section-name:    .note.GNU-stack
+    permissions:     r--
+  - name:            .eh_frame
+    content:         [ 14, 00, 00, 00, 00, 00, 00, 00, 01, 7A, 52, 00, 
+                       01, 78, 10, 01, 1B, 0C, 07, 08, 90, 01, 00, 00, 
+                       14, 00, 00, 00, 1C, 00, 00, 00, 00, 00, 00, 00, 
+                       0E, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 ]
+    alignment:       2^3
+    section-choice:  custom-required
+    section-name:    .eh_frame
+    permissions:     r--
+    references:      
+      - kind:            call32
+        offset:          32
+        target:          .text
index 569aab777fc084cc8a58ab4b76c4bbbd9351df24..bec87e08df1b63cdb929f33d273ce03bd6515f14 100644 (file)
@@ -92,6 +92,11 @@ llvm::cl::opt<bool>
 cmdLineGlobalsNotDeadStrip("keep-globals", 
           llvm::cl::desc("All global symbols are roots for dead-strip"));
 
+llvm::cl::opt<std::string>
+cmdLineEntryPoint("entry",
+              llvm::cl::desc("Specify entry point symbol"),
+              llvm::cl::value_desc("symbol"));
+
 
 enum WriteChoice {
   writeYAML, writeMachO, writePECOFF, writeELF
@@ -221,6 +226,7 @@ int main(int argc, char *argv[]) {
   lo._globalsAreDeadStripRoots = cmdLineGlobalsNotDeadStrip;
   lo._forceLoadArchives = cmdLineForceLoad;
   lo._outputKind = OutputKind::Executable;
+  lo._entrySymbol = cmdLineEntryPoint;
 
   switch (archSelected) {
   case i386: