<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">This is a better fix than I was thinking. Thank you for doing this.</div><div class="gmail_quote"><br></div><div class="gmail_quote">On Sat, Jan 7, 2017 at 7:30 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  6 16:30:35 2017<br>
New Revision: 291293<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=291293&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=291293&view=rev</a><br>
Log:<br>
Handle versioned undefined symbols.<br>
<br>
In order to keep symbol lookup a simple name lookup this patch adds<br>
versioned symbols with an explicit @ to the symbol table.<br>
<br>
Added:<br>
    lld/trunk/test/ELF/undefined-<wbr>versioned-symbol.s<br>
Modified:<br>
    lld/trunk/ELF/InputFiles.cpp<br>
    lld/trunk/ELF/Symbols.cpp<br>
<br>
Modified: lld/trunk/ELF/InputFiles.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=291293&r1=291292&r2=291293&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>InputFiles.cpp?rev=291293&r1=<wbr>291292&r2=291293&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/InputFiles.cpp (original)<br>
+++ lld/trunk/ELF/InputFiles.cpp Fri Jan  6 16:30:35 2017<br>
@@ -651,6 +651,8 @@ template <class ELFT> void SharedFile<EL<br>
       VersymIndex = Versym->vs_index;<br>
       ++Versym;<br>
     }<br>
+    bool Hidden = VersymIndex & VERSYM_HIDDEN;<br>
+    VersymIndex = VersymIndex & ~VERSYM_HIDDEN;<br>
<br>
     StringRef Name = check(Sym.getName(this-><wbr>StringTable));<br>
     if (Sym.isUndefined()) {<br>
@@ -658,15 +660,23 @@ template <class ELFT> void SharedFile<EL<br>
       continue;<br>
     }<br>
<br>
-    if (Versym) {<br>
-      // Ignore local symbols and non-default versions.<br>
-      if (VersymIndex == VER_NDX_LOCAL || (VersymIndex & VERSYM_HIDDEN))<br>
-        continue;<br>
-    }<br>
+    // Ignore local symbols.<br>
+    if (Versym && VersymIndex == VER_NDX_LOCAL)<br>
+      continue;<br>
<br>
     const Elf_Verdef *V =<br>
         VersymIndex == VER_NDX_GLOBAL ? nullptr : Verdefs[VersymIndex];<br>
-    elf::Symtab<ELFT>::X-><wbr>addShared(this, Name, Sym, V);<br>
+<br>
+    if (!Hidden)<br>
+      elf::Symtab<ELFT>::X-><wbr>addShared(this, Name, Sym, V);<br>
+<br>
+    // Also add the symbol with the versioned name to handle undefined symbols<br>
+    // with explicit versions.<br>
+    if (V) {<br>
+      StringRef VerName = this->StringTable.data() + V->getAux()->vda_name;<br>
+      Name = Saver.save(Twine(Name) + "@" + VerName);<br>
+      elf::Symtab<ELFT>::X-><wbr>addShared(this, Name, Sym, V);<br>
+    }<br>
   }<br>
 }<br>
<br>
<br>
Modified: lld/trunk/ELF/Symbols.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=291293&r1=291292&r2=291293&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Symbols.<wbr>cpp?rev=291293&r1=291292&r2=<wbr>291293&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Symbols.cpp (original)<br>
+++ lld/trunk/ELF/Symbols.cpp Fri Jan  6 16:30:35 2017<br>
@@ -202,6 +202,10 @@ void SymbolBody::<wbr>parseSymbolVersion() {<br>
   // Truncate the symbol name so that it doesn't include the version string.<br>
   Name = {S.data(), Pos};<br>
<br>
+  // If this is an undefined or shared symbol it is not a definition.<br>
+  if (isUndefined() || isShared())<br>
+    return;<br>
+<br>
   // '@@' in a symbol name means the default version.<br>
   // It is usually the most recent one.<br>
   bool IsDefault = (Verstr[0] == '@');<br>
<br>
Added: lld/trunk/test/ELF/undefined-<wbr>versioned-symbol.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/undefined-versioned-symbol.s?rev=291293&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>undefined-versioned-symbol.s?<wbr>rev=291293&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/undefined-<wbr>versioned-symbol.s (added)<br>
+++ lld/trunk/test/ELF/undefined-<wbr>versioned-symbol.s Fri Jan  6 16:30:35 2017<br>
@@ -0,0 +1,74 @@<br>
+// REQUIRES: x86<br>
+// RUN: echo ".data; \<br>
+// RUN:       .quad \"basename\"; \<br>
+// RUN:       .quad \"basename@FBSD_1.0\"; \<br>
+// RUN:       .quad \"basename@FBSD_1.1\" " > %t.s<br>
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %t.s -o %t.o<br>
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t2.o<br>
+// RUN: echo "FBSD_1.0 { local: *; }; FBSD_1.1 { };" > %t2.ver<br>
+// RUN: ld.lld --shared --version-script %t2.ver %t2.o -o %t2.so<br>
+// RUN: echo "LIBPKG_1.3 { };" > %t.ver<br>
+// RUN: ld.lld --shared %t.o --version-script %t.ver %t2.so -o %t.so<br>
+// RUN: llvm-readobj --dyn-symbols -r --expand-relocs %t.so | FileCheck %s<br>
+<br>
+// Test that each relocation points to the correct version.<br>
+<br>
+// CHECK:      Section ({{.*}}) .rela.dyn {<br>
+// CHECK-NEXT:   Relocation {<br>
+// CHECK-NEXT:     Offset: 0x2000<br>
+// CHECK-NEXT:     Type: R_X86_64_64 (1)<br>
+// CHECK-NEXT:     Symbol: basename (1)<br>
+// CHECK-NEXT:     Addend: 0x0<br>
+// CHECK-NEXT:   }<br>
+// CHECK-NEXT:   Relocation {<br>
+// CHECK-NEXT:     Offset: 0x2008<br>
+// CHECK-NEXT:     Type: R_X86_64_64 (1)<br>
+// CHECK-NEXT:     Symbol: basename (2)<br>
+// CHECK-NEXT:     Addend: 0x0<br>
+// CHECK-NEXT:   }<br>
+// CHECK-NEXT:   Relocation {<br>
+// CHECK-NEXT:     Offset: 0x2010<br>
+// CHECK-NEXT:     Type: R_X86_64_64 (1)<br>
+// CHECK-NEXT:     Symbol: basename (3)<br>
+// CHECK-NEXT:     Addend: 0x0<br>
+// CHECK-NEXT:   }<br>
+// CHECK-NEXT: }<br>
+<br>
+<br>
+// CHECK:      DynamicSymbols [<br>
+// CHECK-NEXT:   Symbol {<br>
+// CHECK-NEXT:     Name:<br>
+// CHECK-NEXT:     Value:<br>
+// CHECK-NEXT:     Size:<br>
+// CHECK-NEXT:     Binding:<br>
+// CHECK-NEXT:     Type:<br>
+// CHECK-NEXT:     Other:<br>
+// CHECK-NEXT:     Section:<br>
+// CHECK-NEXT:   }<br>
+// CHECK-NEXT:   Symbol {<br>
+// CHECK-NEXT:     Name: basename@FBSD_1.1<br>
+// CHECK-NEXT:     Value:<br>
+// CHECK-NEXT:     Size:<br>
+// CHECK-NEXT:     Binding:<br>
+// CHECK-NEXT:     Type:<br>
+// CHECK-NEXT:     Other:<br>
+// CHECK-NEXT:     Section:<br>
+// CHECK-NEXT:   }<br>
+// CHECK-NEXT:   Symbol {<br>
+// CHECK-NEXT:     Name: basename@FBSD_1.0<br>
+// CHECK-NEXT:     Value:<br>
+// CHECK-NEXT:     Size:<br>
+// CHECK-NEXT:     Binding:<br>
+// CHECK-NEXT:     Type:<br>
+// CHECK-NEXT:     Other:<br>
+// CHECK-NEXT:     Section:<br>
+// CHECK-NEXT:   }<br>
+// CHECK-NEXT:   Symbol {<br>
+// CHECK-NEXT:     Name: basename@FBSD_1.1<br>
+<br>
+<br>
+.global "basename@FBSD_1.0"<br>
+"basename@FBSD_1.0":<br>
+<br>
+.global "basename@@FBSD_1.1"<br>
+"basename@@FBSD_1.1":<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>