C 链接FreeBSD 10.1版本上的铿锵地址消毒剂

C 链接FreeBSD 10.1版本上的铿锵地址消毒剂,c,clang,llvm,freebsd,C,Clang,Llvm,Freebsd,我试图让地址消毒器在FreeBSD 10.1版本上工作,但每当我试图编译一个带有-fsanize=address的程序时,我都会得到对\u asan\u stack\u malloc\u 1等的未定义引用。我发现 在google上添加-L/usr/local/lib-I/usr/local/include的建议并没有解决链接问题。我为FreeBSD尝试了llvm二进制文件,但是当我用这个命令编译时,我得到了/usr/bin//lib/clang/3.6.0/lib/FreeBSD/libclan

我试图让地址消毒器在FreeBSD 10.1版本上工作,但每当我试图编译一个带有
-fsanize=address
的程序时,我都会得到对
\u asan\u stack\u malloc\u 1
等的未定义引用。我发现
在google上添加
-L/usr/local/lib-I/usr/local/include
的建议并没有解决链接问题。我为FreeBSD尝试了llvm二进制文件,但是当我用这个命令编译时,我得到了
/usr/bin//lib/clang/3.6.0/lib/FreeBSD/libclang\u rt.asan-x86\u 64.a,没有这样的文件或目录。
。无论哪种方式,我都不确定我需要链接什么库或它在哪里

下面是我尝试编译的程序,下面是我使用的命令,
clang-fsanize=地址san.c

#include <stdio.h>

int main(void)
{
    return 0;
}
#包括
内部主(空)
{
返回0;
}

要在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并获取铿锵的源文件

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
tar -xvf compiler-rt-3.9.0.src.tar.xz
解压编译器-rt

cd ../projects && fetch http://llvm.org/releases/3.9.0/compiler-rt-3.9.0.src.tar.xz
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
。 然后通过执行
sudomakeinstall
安装新的clang。最后,您可能希望通过运行sudo ln/usr/local/bin/clang/cc将
/usr/bin/cc
链接到
/usr/local/bin/clang


完成所有这些步骤后,您应该能够使用
-fsanize=address
编译选项编译代码。

作为构建LLVM的替代方法,您可以从支持AddressSanitizer的端口安装
llvm37
,并使用该选项进行构建:

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

-链接中的L/usr/local/lib意味着他们已经从端口编译了一个更新版本的clang,并将其安装到/usr/local中。你这样做了吗?很好,但是
-L/usr/lib
-L/lib
也不起作用。“哪个铃声”和“铃声——版本”的输出是什么?
/usr/bin/clang
`FreeBSD铃声版本3.4.1(tags/RELEASE\u 34/dot1 final 208032)20140512`