<div dir="ltr">Please go ahead.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 18, 2017 at 10:53 AM, Rafael Avila de Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
This should probably be ported to 4.0. I can take care of porting it if<br>
it is OK.<br>
<br>
Cheers,<br>
Rafael<br>
<div class="HOEnZb"><div class="h5"><br>
Rafael Espindola via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> writes:<br>
<br>
> 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>
> +  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>
</div></div></blockquote></div><br></div>