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