在 FreeBSD 10.1 版本上链接 clang 地址消毒器
linking clang address sanitizer on FreeBSD 10.1 Release
我正在尝试让地址清理器在 FreeBSD 10.1 版本上运行,但是每当我尝试使用 -fsanitize=address
编译程序时,我都会得到对 _asan_stack_malloc_1
等的未定义引用,等等。我发现
https://forums.freebsd.org/threads/gcc-clang-address-sanitizer.47985/ google 但添加 -L/usr/local/lib -I/usr/local/include
的建议并未解决 linking 问题。我尝试了 FreeBSD 的 llvm 二进制文件,但是当我用那个 clang 编译时,我得到了 /usr/bin/../lib/clang/3.6.0/lib/freebsd/libclang_rt.asan-x86_64.a , no such file or directory.
。无论哪种方式,我都不确定我需要哪个库 link 或者它在哪里。
下面是我尝试编译的程序,这是我使用的命令,
clang -fsanitize=address san.c
#include <stdio.h>
int main(void)
{
return 0;
}
要在 FreeBSD 上使用 asan,您可以构建支持 asan 的 llvm,如下所示,或者您可以从 packages/ports 安装,就像 Kevinoid 的回答一样。
第一步,获取最新稳定的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
解压缩 clang。
tar -xvf cfe-3.9.0.src.tar.xz
进入项目目录,抓取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
转到根 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
如果构建成功,您应该会得到 clang 和 asan 支持。确保删除旧编译器 /usr/bin/clang
、/usr/bin/clang++
和 /usr/bin/cc
。
然后通过 sudo make install
安装新的 clang。最后,您可能希望通过 运行 sudo ln /usr/local/bin/clang /usr/bin/cc
.
link /usr/bin/cc
到 /usr/local/bin/clang
完成所有这些步骤后,您应该能够使用 -fsanitize=address
编译选项编译代码。
作为构建 LLVM 的替代方法,as suggested in this answer on Unix SE,您可以从支持 AddressSanitizer 的端口安装 llvm37
,并使用它构建:
# pkg install llvm37
$ clang37 -fsanitize=address san.c
我正在尝试让地址清理器在 FreeBSD 10.1 版本上运行,但是每当我尝试使用 -fsanitize=address
编译程序时,我都会得到对 _asan_stack_malloc_1
等的未定义引用,等等。我发现
https://forums.freebsd.org/threads/gcc-clang-address-sanitizer.47985/ google 但添加 -L/usr/local/lib -I/usr/local/include
的建议并未解决 linking 问题。我尝试了 FreeBSD 的 llvm 二进制文件,但是当我用那个 clang 编译时,我得到了 /usr/bin/../lib/clang/3.6.0/lib/freebsd/libclang_rt.asan-x86_64.a , no such file or directory.
。无论哪种方式,我都不确定我需要哪个库 link 或者它在哪里。
下面是我尝试编译的程序,这是我使用的命令,
clang -fsanitize=address san.c
#include <stdio.h>
int main(void)
{
return 0;
}
要在 FreeBSD 上使用 asan,您可以构建支持 asan 的 llvm,如下所示,或者您可以从 packages/ports 安装,就像 Kevinoid 的回答一样。
第一步,获取最新稳定的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
解压缩 clang。
tar -xvf cfe-3.9.0.src.tar.xz
进入项目目录,抓取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
转到根 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
如果构建成功,您应该会得到 clang 和 asan 支持。确保删除旧编译器 /usr/bin/clang
、/usr/bin/clang++
和 /usr/bin/cc
。
然后通过 sudo make install
安装新的 clang。最后,您可能希望通过 运行 sudo ln /usr/local/bin/clang /usr/bin/cc
.
/usr/bin/cc
到 /usr/local/bin/clang
完成所有这些步骤后,您应该能够使用 -fsanitize=address
编译选项编译代码。
作为构建 LLVM 的替代方法,as suggested in this answer on Unix SE,您可以从支持 AddressSanitizer 的端口安装 llvm37
,并使用它构建:
# pkg install llvm37
$ clang37 -fsanitize=address san.c