从 gcc/clang 获取 libasan 的位置

Edw*_*ang 4 gcc clang address-sanitizer

当我使用 编译时-fsanitize=address,GCC/Clang 隐式地使用 ASAN 动态库,该库为 ASAN 提供运行时支持。如果您构建的库是由另一个应用程序动态加载的,则必须设置LD_PRELOAD为包含此动态库,以便它在应用程序启动时运行。

通常不清楚libasan.so希望使用哪个GCC/Clang副本,因为您的系统上可能有多个 ASAN 副本(如果您安装了多个编译器。)是否有可靠的方法来确定您需要的共享库的位置装载?

yug*_*ugr 6

您可以使用-print-file-name标志:

GCC_ASAN_PRELOAD=$(gcc -print-file-name=libasan.so)
CLANG_ASAN_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so)
Run Code Online (Sandbox Code Playgroud)

您还可以通过ldd以下方式从库本身提取 libasan 路径:

$ 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
Run Code Online (Sandbox Code Playgroud)