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; 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 " or "-e ". 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/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: 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