Here comes the output
main.cpp
#include <QDebug>
#include <QLibrary>
int main(int, char **)
{
QLibrary l("libshared");
qDebug() << l.load();
return 0;
}
shared.cpp
#include "shared.h"
static Foo f;
Foo::Foo()
{
int *a = 0;
*a = 33;
}
shared.h
class Foo
{
public:
Foo();
};
export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.4
export ASAN_OPTIONS=symbolize=1
g++ -shared -o libshared.so shared.cpp -g3 -fPIC
g++ -fsanitize=address main.cpp -g3 -I /usr/include/qt4/QtCore/ \
-I /usr/include/qt4/ -lQtCore
And then we run it!
$ LD_LIBRARY_PATH=. ./a.out
ASAN:SIGSEGV
=================================================================
==7048== ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000
(pc 0x7f199c1326aa sp 0x7fff37e557c0 bp 0x7fff37e557c0 T0)
AddressSanitizer can not provide additional info.
#0 0x7f199c1326a9 in Foo::Foo() /home/tsdgeos/test/shared.cpp:8
#1 0x7f199c1326da in __static_initialization_and_destruction_0(int, int)
/home/tsdgeos/test/shared.cpp:3
#2 0x7f199c1326ef in _GLOBAL__sub_I_shared.cpp /home/tsdgeos/test/shared.cpp:9
#3 0x7f19a132b139 (/lib64/ld-linux-x86-64.so.2+0x10139)
#4 0x7f19a132b222 (/lib64/ld-linux-x86-64.so.2+0x10222)
#5 0x7f19a132fc6f (/lib64/ld-linux-x86-64.so.2+0x14c6f)
#6 0x7f19a132aff3 (/lib64/ld-linux-x86-64.so.2+0xfff3)
#7 0x7f19a132f3ba (/lib64/ld-linux-x86-64.so.2+0x143ba)
#8 0x7f199d1a602a (/lib/x86_64-linux-gnu/libdl.so.2+0x102a)
#9 0x7f19a132aff3 (/lib64/ld-linux-x86-64.so.2+0xfff3)
#10 0x7f199d1a662c (/lib/x86_64-linux-gnu/libdl.so.2+0x162c)
#11 0x7f199d1a60c0 (/lib/x86_64-linux-gnu/libdl.so.2+0x10c0)
#12 0x7f199e0156b7 (/usr/lib/x86_64-linux-gnu/libQtCore.so.4+0x16e6b7)
#13 0x7f199e010599 (/usr/lib/x86_64-linux-gnu/libQtCore.so.4+0x169599)
#14 0x4011c0 in main /home/tsdgeos/test/main.cpp:8
#15 0x7f199d5e8ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)
#16 0x401078 in _start (/home/tsdgeos/test/a.out+0x401078)
SUMMARY: AddressSanitizer: SEGV /home/tsdgeos/test/shared.cpp:8 Foo::Foo()
==7048== ABORTING
So it seems that "plugins are just libraries" applies here :)