从gcc/clang获取libasan的位置

从gcc/clang获取libasan的位置,gcc,clang,address-sanitizer,Gcc,Clang,Address Sanitizer,当我使用-fsanize=address编译时,GCC/Clang隐式地使用ASAN动态库,它为ASAN提供运行时支持。如果生成的库由另一个应用程序动态加载,则有必要将LD_PRELOAD设置为包含此动态库,以便它在应用程序启动时运行 通常不清楚libasan的哪个副本。因此GCC/Clang希望使用哪个副本,因为您的系统上可能有多个ASAN副本(如果您安装了多个编译器)。是否有可靠的方法确定您需要加载的共享库的位置?您可以使用-print file name标志: GCC_ASAN_PRELO

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


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

您可以使用
-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)
您还可以通过
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

迟做总比不做好——我已经用更合适的方法更新了我的答案。