summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp20
-rw-r--r--lld/test/ELF/Inputs/startstop-shared2.s2
-rw-r--r--lld/test/ELF/startstop-shared2.s14
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"
OpenPOWER on IntegriCloud