[PATCH] D25544: ELF: Override DSO definitions when creating __start_* and __stop_* symbols.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 13 15:29:38 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL284168: ELF: Override DSO definitions when creating __start_* and __stop_* symbols. (authored by pcc).

Changed prior to commit:
  https://reviews.llvm.org/D25544?vs=74469&id=74591#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D25544

Files:
  lld/trunk/ELF/Writer.cpp
  lld/trunk/test/ELF/Inputs/startstop-shared2.s
  lld/trunk/test/ELF/startstop-shared2.s


Index: lld/trunk/test/ELF/Inputs/startstop-shared2.s
===================================================================
--- lld/trunk/test/ELF/Inputs/startstop-shared2.s
+++ lld/trunk/test/ELF/Inputs/startstop-shared2.s
@@ -0,0 +1,2 @@
+.globl __start_foo
+__start_foo:
Index: lld/trunk/test/ELF/startstop-shared2.s
===================================================================
--- lld/trunk/test/ELF/startstop-shared2.s
+++ lld/trunk/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"
Index: lld/trunk/ELF/Writer.cpp
===================================================================
--- lld/trunk/ELF/Writer.cpp
+++ lld/trunk/ELF/Writer.cpp
@@ -546,15 +546,15 @@
 }
 
 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 @@
   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>


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25544.74591.patch
Type: text/x-patch
Size: 2606 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161013/a36ecf99/attachment.bin>


More information about the llvm-commits mailing list