diff options
-rw-r--r-- | lld/ELF/Writer.cpp | 20 | ||||
-rw-r--r-- | lld/test/ELF/Inputs/startstop-shared2.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/startstop-shared2.s | 14 |
3 files changed, 23 insertions, 13 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index ade3ead7059..5688cc2f6d9 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -546,15 +546,15 @@ void PhdrEntry<ELFT>::add(OutputSectionBase<ELFT> *Sec) { } template <class ELFT> -static Symbol *addOptionalSynthetic(StringRef Name, - OutputSectionBase<ELFT> *Sec, - typename ELFT::uint Val) { +static Symbol * +addOptionalSynthetic(StringRef Name, OutputSectionBase<ELFT> *Sec, + typename ELFT::uint Val, uint8_t StOther = STV_HIDDEN) { SymbolBody *S = Symtab<ELFT>::X->find(Name); if (!S) return nullptr; if (!S->isUndefined() && !S->isShared()) return S->symbol(); - return Symtab<ELFT>::X->addSynthetic(Name, Sec, Val, STV_HIDDEN); + return Symtab<ELFT>::X->addSynthetic(Name, Sec, Val, StOther); } template <class ELFT> @@ -974,15 +974,9 @@ void Writer<ELFT>::addStartStopSymbols(OutputSectionBase<ELFT> *Sec) { if (!isValidCIdentifier(S)) return; StringSaver Saver(Alloc); - StringRef Start = Saver.save("__start_" + S); - StringRef Stop = Saver.save("__stop_" + S); - if (SymbolBody *B = Symtab<ELFT>::X->find(Start)) - if (B->isUndefined()) - Symtab<ELFT>::X->addSynthetic(Start, Sec, 0, B->getVisibility()); - if (SymbolBody *B = Symtab<ELFT>::X->find(Stop)) - if (B->isUndefined()) - Symtab<ELFT>::X->addSynthetic( - Stop, Sec, DefinedSynthetic<ELFT>::SectionEnd, B->getVisibility()); + addOptionalSynthetic(Saver.save("__start_" + S), Sec, 0, STV_DEFAULT); + addOptionalSynthetic(Saver.save("__stop_" + S), Sec, + DefinedSynthetic<ELFT>::SectionEnd, STV_DEFAULT); } template <class ELFT> diff --git a/lld/test/ELF/Inputs/startstop-shared2.s b/lld/test/ELF/Inputs/startstop-shared2.s new file mode 100644 index 00000000000..414bf6dc876 --- /dev/null +++ b/lld/test/ELF/Inputs/startstop-shared2.s @@ -0,0 +1,2 @@ +.globl __start_foo +__start_foo: diff --git a/lld/test/ELF/startstop-shared2.s b/lld/test/ELF/startstop-shared2.s new file mode 100644 index 00000000000..0ba35ecc50b --- /dev/null +++ b/lld/test/ELF/startstop-shared2.s @@ -0,0 +1,14 @@ +// REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/startstop-shared2.s -o %t.o +// RUN: ld.lld -o %t.so %t.o -shared +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t2.o +// RUN: ld.lld -o %t %t2.o %t.so +// RUN: llvm-objdump -s -h %t | FileCheck %s + +// CHECK: foo 00000000 0000000000011008 + +// CHECK: Contents of section .text: +// CHECK-NEXT: 11000 08100100 00000000 + +.quad __start_foo +.section foo,"ax" |