diff options
author | Denis Protivensky <dprotivensky@accesssoftek.com> | 2015-10-08 06:48:38 +0000 |
---|---|---|
committer | Denis Protivensky <dprotivensky@accesssoftek.com> | 2015-10-08 06:48:38 +0000 |
commit | 90c5099e8a6e78aa29575bfdc83dfbf1543af7fc (patch) | |
tree | 1ba11ae0541d25b4fcf88e4d0b56dd8ce54efefd | |
parent | c10b8381f761ad7ff9a8c34b687b9320e07f9726 (diff) | |
download | bcm5719-llvm-90c5099e8a6e78aa29575bfdc83dfbf1543af7fc.tar.gz bcm5719-llvm-90c5099e8a6e78aa29575bfdc83dfbf1543af7fc.zip |
[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
llvm-svn: 249661
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 14 | ||||
-rw-r--r-- | lld/test/elf2/linkerscript.s | 23 |
2 files changed, 35 insertions, 2 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 474801f3b80..a2b4fa5687f 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -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 (;;) { diff --git a/lld/test/elf2/linkerscript.s b/lld/test/elf2/linkerscript.s index a7ca392dfac..9703362175f 100644 --- a/lld/test/elf2/linkerscript.s +++ b/lld/test/elf2/linkerscript.s @@ -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 |