[llvm-dev] [lld] bug detecting undefined symbols in shared libraries
Scott Smith via llvm-dev
llvm-dev at lists.llvm.org
Mon Dec 11 15:39:02 PST 2017
I have a test case where lld-5.0 fails to detect an undefined symbol (this
bug also happens with clang/lld 4.0). I haven't narrowed down exactly all
the circumstances when this can occur, but in this case it was for a
virtual method in a class defined in a shared library. If I build the
executable with the raw object files, the linker notices the missing method
(see test1 vs test2). This was tested on Ubuntu 14.04 using the
llvm/clang-5.0 downloaded from the official apt repository.
If I use gold (from binutils 2.26), it finds the error during link time.
********** DEMO OUTPUT
$ make clean && make
rm -f main.o virtual.o virtual.so test1 test2
clang++-5.0 -fPIC -c main.cc
clang++-5.0 -fPIC -c virtual.cc
clang++-5.0 -fPIC -fuse-ld=lld-5.0 -shared -o virtual.so virtual.o
clang++-5.0 -fPIC -fuse-ld=lld-5.0 -Wl,-R$ORIGIN. -o test1 main.o virtual.so
clang++-5.0 -fPIC -fuse-ld=lld-5.0 -Wl,-R$ORIGIN. -o test2 main.o virtual.o
/usr/bin/ld.lld-5.0: error: undefined symbol: foo::bar()
>>> referenced by virtual.cc
>>> virtual.o:(vtable for foo)
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
make: *** [test2] Error 1
Note that running test1 results in an error:
$ ./test1
./test1: symbol lookup error: ./virtual.so: undefined symbol: _ZN3foo3barEv
********** CODE main.cc
#include "virtual.h"
int main() {
foo baz;
return 0;
}
********** CODE virtual.h
struct foo {
virtual ~foo();
virtual void bar();
};
********** CODE virtual.cc
#include "virtual.h"
foo::~foo() { }
********* CODE Makefile
all: test1 test2
CC = clang++-5.0 -fPIC
LD = ${CC} -fuse-ld=lld-5.0
test1: main.o virtual.so
${LD} -Wl,-R$$ORIGIN. -o test1 main.o virtual.so
test2: main.o virtual.o
${LD} -Wl,-R$$ORIGIN. -o test2 main.o virtual.o
virtual.o: virtual.cc virtual.h
${CC} -c virtual.cc
virtual.so: virtual.o
${LD} -shared -o virtual.so virtual.o
main.o: main.cc virtual.h
${CC} -c main.cc
clean:
rm -f main.o virtual.o virtual.so test1 test2
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171211/9ae46b83/attachment.html>
More information about the llvm-dev
mailing list