在 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