[PATCH] D27497: [ELF] Shared libraries should have entry point
Petr Hosek via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 6 17:55:22 PST 2016
phosek created this revision.
phosek added a reviewer: ruiu.
phosek added a subscriber: llvm-commits.
phosek set the repository for this revision to rL LLVM.
phosek added a project: lld.
Shared libraries should have entry set following the same rules as for regular binaries. The only difference is that in case the default entry point (_start or __start) isn't found (unless it was set explicitly), we shouldn't give a warning as in case of regular binaries.
Repository:
rL LLVM
https://reviews.llvm.org/D27497
Files:
ELF/Config.h
ELF/Driver.cpp
ELF/Writer.cpp
test/ELF/gc-sections-keep-shared-start.s
Index: test/ELF/gc-sections-keep-shared-start.s
===================================================================
--- /dev/null
+++ test/ELF/gc-sections-keep-shared-start.s
@@ -0,0 +1,29 @@
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+
+# RUN: ld.lld -shared --gc-sections -o %t1 %t
+# RUN: llvm-readobj --elf-output-style=GNU --file-headers --symbols %t1
+# | FileCheck %s
+# CHECK: Entry point address: 0x1000
+# CHECK: 0000000000001000 0 FUNC LOCAL HIDDEN 4 _start
+# CHECK: 0000000000001006 0 FUNC LOCAL HIDDEN 4 internal
+# CHECK: 0000000000001005 0 FUNC GLOBAL DEFAULT 4 foobar
+
+.section .text.start,"ax"
+.globl _start
+.type _start,%function
+.hidden _start
+_start:
+ jmp internal
+
+.section .text.foobar,"ax"
+.globl foobar
+.type foobar,%function
+foobar:
+ ret
+
+.section .text.internal,"ax"
+.globl internal
+.hidden internal
+.type internal,%function
+internal:
+ ret
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -1410,14 +1410,16 @@
// Case 4
if (OutputSectionBase *Sec = findSection(".text")) {
- warn("cannot find entry symbol " + Config->Entry + "; defaulting to 0x" +
- utohexstr(Sec->Addr));
+ if (!Config->Shared || Config->HasEntry)
+ warn("cannot find entry symbol " + Config->Entry + "; defaulting to 0x" +
+ utohexstr(Sec->Addr));
return Sec->Addr;
}
// Case 5
- warn("cannot find entry symbol " + Config->Entry +
- "; not setting start address");
+ if (!Config->Shared || Config->HasEntry)
+ warn("cannot find entry symbol " + Config->Entry +
+ "; not setting start address");
return 0;
}
Index: ELF/Driver.cpp
===================================================================
--- ELF/Driver.cpp
+++ ELF/Driver.cpp
@@ -521,6 +521,7 @@
Config->EnableNewDtags = !Args.hasArg(OPT_disable_new_dtags);
Config->ExportDynamic = Args.hasArg(OPT_export_dynamic);
Config->FatalWarnings = Args.hasArg(OPT_fatal_warnings);
+ Config->HasEntry = Args.hasArg(OPT_entry);
Config->GcSections = getArg(Args, OPT_gc_sections, OPT_no_gc_sections, false);
Config->GdbIndex = Args.hasArg(OPT_gdb_index);
Config->ICF = Args.hasArg(OPT_icf);
@@ -786,8 +787,7 @@
// It is either "-e <addr>" or "-e <symbol>".
if (!Config->Entry.getAsInteger(0, Config->EntryAddr))
Config->Entry = "";
- } else if (!Config->Shared && !Config->Relocatable &&
- Config->EMachine != EM_AMDGPU) {
+ } else if (!Config->Relocatable && Config->EMachine != EM_AMDGPU) {
// -e was not specified. Use the default start symbol name
// if it is resolvable.
Config->Entry = (Config->EMachine == EM_MIPS) ? "__start" : "_start";
Index: ELF/Config.h
===================================================================
--- ELF/Config.h
+++ ELF/Config.h
@@ -107,6 +107,7 @@
bool GcSections;
bool GdbIndex;
bool GnuHash = false;
+ bool HasEntry = false;
bool ICF;
bool Mips64EL = false;
bool MipsN32Abi = false;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27497.80520.patch
Type: text/x-patch
Size: 3107 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161207/44f0d60e/attachment.bin>
More information about the llvm-commits
mailing list