<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 13, 2017 at 11:18 AM, Rafael Espindola via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Fri Jan 13 13:18:11 2017<br>
New Revision: 291944<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=291944&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=291944&view=rev</a><br>
Log:<br>
Don't add DT_INIT/DT_FINI for undef and shared symbols.<br>
<br>
The freebsd dynamic linker doesn't check if the value is null (and it<br>
is reasonable for it to do that). That means that producing a .so with<br>
a null DT_INIT/DT_FINI causes the base address to be called.<br>
<br>
This should fix the libreoffice build.<br>
<br>
Modified:<br>
    lld/trunk/ELF/SymbolTable.cpp<br>
    lld/trunk/ELF/SymbolTable.h<br>
    lld/trunk/ELF/<wbr>SyntheticSections.cpp<br>
    lld/trunk/test/ELF/init-fini.s<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=291944&r1=291943&r2=291944&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>SymbolTable.cpp?rev=291944&r1=<wbr>291943&r2=291944&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/SymbolTable.cpp (original)<br>
+++ lld/trunk/ELF/SymbolTable.cpp Fri Jan 13 13:18:11 2017<br>
@@ -468,6 +468,14 @@ template <class ELFT> SymbolBody *Symbol<br>
 }<br>
<br>
 template <class ELFT><br>
+SymbolBody *SymbolTable<ELFT>::<wbr>findDefined(StringRef Name) {<br></blockquote><div><br></div><div>Can you make this name more specific so that it captures the intent of what this function does better?</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  if (SymbolBody *S = find(Name))<br>
+    if (S->isDefined() && !S->isShared())<br>
+      return S;<br>
+  return nullptr;<br>
+}<br>
+<br>
+template <class ELFT><br>
 void SymbolTable<ELFT>::<wbr>addLazyArchive(ArchiveFile *F,<br>
                                        const object::Archive::Symbol Sym) {<br>
   Symbol *S;<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=291944&r1=291943&r2=291944&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>SymbolTable.h?rev=291944&r1=<wbr>291943&r2=291944&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/SymbolTable.h (original)<br>
+++ lld/trunk/ELF/SymbolTable.h Fri Jan 13 13:18:11 2017<br>
@@ -82,6 +82,7 @@ public:<br>
   void scanVersionScript();<br>
<br>
   SymbolBody *find(StringRef Name);<br>
+  SymbolBody *findDefined(StringRef Name);<br>
<br>
   void trace(StringRef Name);<br>
   void wrap(StringRef Name);<br>
<br>
Modified: lld/trunk/ELF/<wbr>SyntheticSections.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=291944&r1=291943&r2=291944&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>SyntheticSections.cpp?rev=<wbr>291944&r1=291943&r2=291944&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/<wbr>SyntheticSections.cpp (original)<br>
+++ lld/trunk/ELF/<wbr>SyntheticSections.cpp Fri Jan 13 13:18:11 2017<br>
@@ -883,9 +883,9 @@ template <class ELFT> void DynamicSectio<br>
     add({DT_FINI_ARRAYSZ, Out<ELFT>::FiniArray, Entry::SecSize});<br>
   }<br>
<br>
-  if (SymbolBody *B = Symtab<ELFT>::X->find(Config-><wbr>Init))<br>
+  if (SymbolBody *B = Symtab<ELFT>::X->findDefined(<wbr>Config->Init))<br>
     add({DT_INIT, B});<br>
-  if (SymbolBody *B = Symtab<ELFT>::X->find(Config-><wbr>Fini))<br>
+  if (SymbolBody *B = Symtab<ELFT>::X->findDefined(<wbr>Config->Fini))<br>
     add({DT_FINI, B});<br>
<br>
   bool HasVerNeed = In<ELFT>::VerNeed->getNeedNum(<wbr>) != 0;<br>
<br>
Modified: lld/trunk/test/ELF/init-fini.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/init-fini.s?rev=291944&r1=291943&r2=291944&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>init-fini.s?rev=291944&r1=<wbr>291943&r2=291944&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/init-fini.s (original)<br>
+++ lld/trunk/test/ELF/init-fini.s Fri Jan 13 13:18:11 2017<br>
@@ -17,11 +17,22 @@<br>
 // RUN: ld.lld -shared %t -o %t2 -init=_foo -fini=_bar<br>
 // RUN: llvm-readobj -dynamic-table %t2 | FileCheck --check-prefix=OVR %s<br>
<br>
-// Should add a dynamic table entry even if a given symbol stay undefined<br>
+// Don't add an entry for undef. The freebsd dynamic linker doesn't<br>
+// check if the value is null. If it is, it will just call the<br>
+// load address.<br>
 // RUN: ld.lld -shared %t -o %t2 -init=_undef -fini=_undef<br>
 // RUN: llvm-readobj -dynamic-table %t2 | FileCheck --check-prefix=UNDEF %s<br>
-// UNDEF: INIT 0x0<br>
-// UNDEF: FINI 0x0<br>
+// UNDEF-NOT: INIT<br>
+// UNDEF-NOT: FINI<br>
+<br>
+// Don't add an entry for shared. For the same reason as undef.<br>
+// RUN: ld.lld -shared %t -o %t.so<br>
+// RUN: echo > %t.s<br>
+// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t.s -o %t2.o<br>
+// RUN: ld.lld -shared %t2.o %t.so -o %t2<br>
+// RUN: llvm-readobj -dynamic-table %t2 | FileCheck --check-prefix=SHARED %s<br>
+// SHARED-NOT: INIT<br>
+// SHARED-NOT: FINI<br>
<br>
 // Should not add new entries to the symbol table<br>
 // and should not require given symbols to be resolved<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>