From fb4f2fedd1e4402f1d8a933813c2addb83d07e24 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 29 Apr 2016 17:46:07 +0000 Subject: [PATCH] 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 --- lld/ELF/InputFiles.cpp | 9 ++++++--- lld/test/ELF/Inputs/version-undef-sym.so | Bin 0 -> 2312 bytes lld/test/ELF/version-undef-sym.s | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100755 lld/test/ELF/Inputs/version-undef-sym.so create mode 100644 lld/test/ELF/version-undef-sym.s diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index a4b5b718e381..2c7124e6a05c 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -490,16 +490,19 @@ template void SharedFile::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; diff --git a/lld/test/ELF/Inputs/version-undef-sym.so b/lld/test/ELF/Inputs/version-undef-sym.so new file mode 100755 index 0000000000000000000000000000000000000000..abb4399cd6c7d48733ac6fef0353b62b97760ee4 GIT binary patch literal 2312 zcmc&#J#Q015FPtMFdu~@0YZS#r9c89SvcV%1xoCIO^_TSnJ5S-j&p2q3fq$Jh?I(! zl7B&dN`8hV8cOIvX5Q{T+jlt^&@k4{?7W%To!#3Rf2uX=`CLv&o~#SBle|SL&ak!U zCMqhjCZ6&OQZT*?Q`4y#*P#^gjSu#~lEhE)7N;Dk4Ky+w%r`Tn^*3<^6D69jXucxn zbpT7}jC|k&!X9UIoYjH7&gqy(m(}2B7&jDKlAq(W>6QXTUHRDa6DI7FM64NkW#Km! z&swKE2QSW9=bG_foO}mW4dJeQJ5BPiwOnY+fQ$Pd!qc1K zxo7wH^j3M^B<@Y_C5bOc)_FX=P2NM&|Ma_o-P8BYI;KCaJ(q!_9)YLp!B-q3O{kx& zy1J`)Ry{mY+}Dw&#|rpqQ1z;gtaY~L;M}*yW!A`yYvbG!SRyP~9z?PV;p4sYRA(khlhjKGTiF(w@sz@n1>cwG8WjwU9 z%UL&!x>9N%_0`47cqpY0{g0)?&M-O{^b<JnQ|AVz4oueS?yHLR}2G<){jp+E{x6 z<5@?PSDYv9X}PX;^cdo-H_9~^&m5V*g9YypIWeB^j*@G)S_K##=wAl5JAM+TkR z8IS)J(2@?u8o;q{_^3+n44<;}{mte+^%Ct1RvWnh^b7un!@}=}|LCm!KfC?k!g+?$ G`~Ly{kDK=Z literal 0 HcmV?d00001 diff --git a/lld/test/ELF/version-undef-sym.s b/lld/test/ELF/version-undef-sym.s new file mode 100644 index 000000000000..bdb4795fd1f3 --- /dev/null +++ b/lld/test/ELF/version-undef-sym.s @@ -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