Be sure to always increment the Versym pointer.

It was getting out of sync if we had undefined symbols at the start of
the symbol table.

llvm-svn: 268077
This commit is contained in:
Rafael Espindola 2016-04-29 17:46:07 +00:00
parent 74ca1cc7d0
commit fb4f2fedd1
3 changed files with 27 additions and 3 deletions

View File

@ -490,16 +490,19 @@ template <class ELFT> void SharedFile<ELFT>::parseRest() {
uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
SymbolBodies.reserve(NumSymbols);
for (const Elf_Sym &Sym : Syms) {
unsigned VersymIndex = 0;
if (Versym) {
VersymIndex = Versym->vs_index;
++Versym;
}
StringRef Name = check(Sym.getName(this->StringTable));
if (Sym.isUndefined()) {
Undefs.push_back(Name);
continue;
}
unsigned VersymIndex = 0;
if (Versym) {
VersymIndex = Versym->vs_index;
++Versym;
// Ignore local symbols and non-default versions.
if (VersymIndex == 0 || (VersymIndex & VERSYM_HIDDEN))
continue;

Binary file not shown.

View File

@ -0,0 +1,21 @@
// REQUIRES: x86
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
// RUN: llvm-readobj --dyn-symbols %p/Inputs/version-undef-sym.so | FileCheck %s
// Show that the input .so has undefined symbols before bar. That is what would
// get our version parsing out of sync.
// CHECK: Section: Undefined
// CHECK: Section: Undefined
// CHECK: Section: Undefined
// CHECK: Section: Undefined
// CHECK: Section: Undefined
// CHECK: Name: bar
// But now we can successfully find bar.
// RUN: ld.lld %t %p/Inputs/version-undef-sym.so -o %t.exe
.global _start
_start:
call bar@plt