【问题标题】:linking clang address sanitizer on FreeBSD 10.1 Release在 FreeBSD 10.1 Release 上链接 clang 地址清理程序
【发布时间】:2015-07-17 01:54:51
【问题描述】:

我正在尝试让地址清理程序在 FreeBSD 10.1 版本上工作,但每当我尝试使用 -fsanitize=address 编译程序时,我都会得到对 _asan_stack_malloc_1 等的未定义引用,等等。我发现
https://forums.freebsd.org/threads/gcc-clang-address-sanitizer.47985/ on google 但添加-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;
}

【问题讨论】:

  • -L /usr/local/lib 在您的链接中意味着他们已经从端口编译了更新版本的 clang 并将其安装到 /usr/local 中。你这样做了吗?
  • 好点,但-L/usr/lib-L/lib 也不起作用。
  • “which clang”和“clang --version”的输出是什么?
  • /usr/bin/clang ` FreeBSD clang 版本 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512`

标签: c clang llvm freebsd


【解决方案1】:

要在 FreeBSD 上使用 asan,您可以构建带有 asan 支持的 llvm,如下所示,或者您可以像 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

解压编译器-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

如果构建工作正常,您应该留下带有 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 编译选项编译代码。

【讨论】:

    【解决方案2】:

    作为构建 LLVM as suggested in this answer on Unix SE 的替代方法,您可以从支持 AddressSanitizer 的端口安装 llvm37,并使用它进行构建:

    # pkg install llvm37
    $ clang37 -fsanitize=address san.c
    

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 2013-04-14
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      相关资源
      最近更新 更多