[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