[lld] r249661 - [ELF2] Add ENTRY command to the linker script

Denis Protivensky via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 7 23:48:38 PDT 2015


Author: denis-protivensky
Date: Thu Oct  8 01:48:38 2015
New Revision: 249661

URL: http://llvm.org/viewvc/llvm-project?rev=249661&view=rev
Log:
[ELF2] Add ENTRY command to the linker script

Set ENTRY as an entry point if -e is not specified.

Differential Revision: http://reviews.llvm.org/D13509

Modified:
    lld/trunk/ELF/LinkerScript.cpp
    lld/trunk/test/elf2/linkerscript.s

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=249661&r1=249660&r2=249661&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Thu Oct  8 01:48:38 2015
@@ -37,6 +37,7 @@ private:
   void expect(StringRef Expect);
 
   void readAsNeeded();
+  void readEntry();
   void readGroup();
   void readOutput();
   void readOutputFormat();
@@ -49,7 +50,9 @@ private:
 void LinkerScript::run() {
   while (!atEOF()) {
     StringRef Tok = next();
-    if (Tok == "GROUP") {
+    if (Tok == "ENTRY") {
+      readEntry();
+    } else if (Tok == "GROUP") {
       readGroup();
     } else if (Tok == "OUTPUT") {
       readOutput();
@@ -131,6 +134,15 @@ void LinkerScript::readAsNeeded() {
   }
 }
 
+void LinkerScript::readEntry() {
+  // -e <symbol> takes predecence over ENTRY(<symbol>).
+  expect("(");
+  StringRef Tok = next();
+  if (Config->Entry.empty())
+    Config->Entry = Tok;
+  expect(")");
+}
+
 void LinkerScript::readGroup() {
   expect("(");
   for (;;) {

Modified: lld/trunk/test/elf2/linkerscript.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/linkerscript.s?rev=249661&r1=249660&r2=249661&view=diff
==============================================================================
--- lld/trunk/test/elf2/linkerscript.s (original)
+++ lld/trunk/test/elf2/linkerscript.s Thu Oct  8 01:48:38 2015
@@ -10,6 +10,26 @@
 # RUN: ld.lld2 -o %t2 %t.script1
 # RUN: llvm-readobj %t2 > /dev/null
 
+# RUN: echo "ENTRY(_label)" > %t.script
+# RUN: ld.lld2 -o %t2 %t.script %t
+# RUN: llvm-readobj %t2 > /dev/null
+
+# RUN: echo "ENTRY(_wrong_label)" > %t.script
+# RUN: not lld -flavor gnu2 -o %t2 %t.script %t > %t.log 2>&1
+# RUN: FileCheck -check-prefix=ERR-ENTRY %s < %t.log
+
+# ERR-ENTRY: undefined symbol: _wrong_label
+
+# -e has precedence over linker script's ENTRY.
+# RUN: echo "ENTRY(_label)" > %t.script
+# RUN: ld.lld2 -e _start -o %t2 %t.script %t
+# RUN: llvm-readobj -file-headers -symbols %t2 | \
+# RUN:   FileCheck -check-prefix=ENTRY-OVERLOAD %s
+
+# ENTRY-OVERLOAD: Entry: [[ENTRY:0x[0-9A-F]+]]
+# ENTRY-OVERLOAD: Name: _start
+# ENTRY-OVERLOAD-NEXT: Value: [[ENTRY]]
+
 # RUN: echo "OUTPUT_FORMAT(\"elf64-x86-64\") /*/*/ GROUP(" %t ")" > %t.script
 # RUN: ld.lld2 -o %t2 %t.script
 # RUN: llvm-readobj %t2 > /dev/null
@@ -29,8 +49,9 @@
 
 # ERR1: unknown directive: FOO
 
-.globl _start;
+.globl _start, _label;
 _start:
   mov $60, %rax
   mov $42, %rdi
+_label:
   syscall




More information about the llvm-commits mailing list