问题
When I compile with -fsanitize=address
, GCC/Clang implicitly make use of an ASAN dynamic library which provides runtime support for ASAN. If your built library is dynamically loaded by another application, it is necessary to set LD_PRELOAD
to include this dynamic library, so that it gets run at application start up time.
It is often not obvious which copy of libasan.so
GCC/Clang expects to use, because there may be multiple copies of ASAN on your system (if you have multiple compilers installed.) Is there a reliable way to determine the location of the shared library you need to load?
回答1:
You can use -print-file-name
flag:
GCC_ASAN_PRELOAD=$(gcc -print-file-name=libasan.so)
CLANG_ASAN_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so)
You could also extract libasan path from the library itself via ldd
:
$ echo 'void foo() {}' | gcc -x c -fPIC -shared -fsanitize=address -
$ ldd a.out | grep libasan.so | awk '{print $3}'
/usr/lib/x86_64-linux-gnu/libasan.so.4
来源:https://stackoverflow.com/questions/48833176/get-location-of-libasan-from-gcc-clang