我正在尝试使用FreeBSD 10.1 Release进行地址清理程序,但每当我尝试使用-fsanitize=address
编译程序时,我会得到_asan_stack_malloc_1
等未定义的引用,我发现
谷歌https://forums.freebsd.org/threads/gcc-clang-address-sanitizer.47985/,但添加-L/usr/local/lib -I/usr/local/include
的建议无法解决链接问题。我为FreeBSD尝试了llvm二进制文件,但是当我使用该clang进行编译时,我得到了/usr/bin/../lib/clang/3.6.0/lib/freebsd/libclang_rt.asan-x86_64.a , no such file or directory.
。无论哪种方式,我都不确定我需要链接哪个库或它在哪里。
下面是我尝试编译的程序,这是我使用的命令,
clang -fsanitize=address san.c
#include <stdio.h>
int main(void)
{
return 0;
}
答案 0 :(得分:1)
要在FreeBSD上使用asan,您可以使用asan支持构建llvm,如下所示,或者您可以从Kevinoid的答案中的packages / ports安装。
第一步,抓住最新的稳定llvm源。
fetch http://llvm.org/releases/3.9.0/llvm-3.9.0.src.tar.xz
现在解压缩llvm源目录。
tar -xvf llvm-3.9.0.src.tar.xz
接下来将目录更改为llvm并获取clang源文件。
cd llvm-3.9.0.src/tools && fetch http://llvm.org/releases/3.9.0/cfe-3.9.0.src.tar.xz
解压缩铿锵。
tar -xvf cfe-3.9.0.src.tar.xz
进入projects目录并获取compiler-rt。
cd ../projects && fetch http://llvm.org/releases/3.9.0/compiler-rt-3.9.0.src.tar.xz
解压缩compiler-rt。
tar -xvf compiler-rt-3.9.0.src.tar.xz
转到root llvm目录并为cmake创建一个构建目录。
cd ../ && mkdir build && cd build
使用cmake设置llvm构建。
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON [-DLLVM_ENABLE_WERROR=ON] [-DLLVM_TARGETS_TO_BUILD=X86] -DBUILD_SHARED_LIBS=ON ../
建立llvm并去喝茶,这需要一点时间。
make -j12
如果构建工作,你应该留下asan支持clang。请务必删除旧的编译器/usr/bin/clang
,/usr/bin/clang++
和/usr/bin/cc
。
然后通过执行sudo make install
安装新的clang。最后,您可能希望通过运行/usr/bin/cc
将/usr/local/bin/clang
与sudo ln /usr/local/bin/clang /usr/bin/cc
相关联。
完成所有这些步骤后,您应该能够使用-fsanitize=address
编译选项编译代码。
答案 1 :(得分:1)
作为构建LLVM的替代方法as suggested in this answer on Unix SE,您可以从端口安装llvm37
,端口支持AddressSanitizer,并使用它构建:
# pkg install llvm37
$ clang37 -fsanitize=address san.c