[lld] r291293 - Handle versioned undefined symbols.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 6 22:19:08 PST 2017


This is a better fix than I was thinking. Thank you for doing this.

On Sat, Jan 7, 2017 at 7:30 AM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

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


More information about the llvm-commits mailing list