前言
众所周知,C语言编译器中,Clang比GCC编译速度更快,编译产出更小,出错提示更友好,所以能用Clang当然就会用Clang。但是装Clang还有一堆环境问题让人头疼,如果不是要用AFLGo,我也懒得把带有gold-plugin的LLVM这一套东西装起来。踩了一些坑,最终也算装成了。网上的教程千奇百怪,而且大部分比较老,最后我探索了一个比较简洁的安装方式,这里把安装的过程记录一下,方便日后回忆。
我使用的是系统ubuntu 16.04 LTS,使用的是源码安装LLVM 6.0.0。
安装
在安装前先保证系统中有make,cmake,ninja(一个代替make的编译工具),python2.7,bitnutils(这个就是我们的gold-plugin)。
apt-get install make cmake ninja-build python2.7 binutils-gold binutils-dev
然后通过网站 http://releases.llvm.org/download.html 下载所需要的包(为什么不git或者svn下载?因为我这下载太慢,用浏览器会快一些)。所需的包有(这里以6.0.0为例,如果是其他版本就在对应版本下下载),:
cfe-6.0.0.src libcxx-6.0.0.src
clang-tools-extra-6.0.0.src libcxxabi-6.0.0.src
compiler-rt-6.0.0.src llvm-6.0.0.src
PS:其实libcxx和libcxxabi不用也可以用AFL的llvm模式,这里顺便装了而已。
下下来的包是tar.xz的两层压缩包,通过xz和tar解压($DOWNLOAD是包的位置):
cd $DOWNLOAD
xz -d 六个包
tar -xvf 六个包
然后把解压的六个包放在一个文件夹中:
sudo mkdir src
for i in *.src; do sudo mv $i src/$i; done
cd src/
接着把目录变得漂亮一些,为编译做准备:
sudo mv cfe-6.0.0.src clang
sudo mv clang llvm-6.0.0.src/tools
sudo mv clang-tools-extra-6.0.0.src extra
sudo mv extra/ llvm-6.0.0.src/tools/clang/
sudo mv compiler-rt-6.0.0.src compiler-rt
sudo mv compiler-rt llvm-6.0.0.src/projects/
sudo mv libcxx-6.0.0.src libcxx
sudo mv libcxx llvm-6.0.0.src/projects/
sudo mv libcxxabi-6.0.0.src libcxxabi
sudo mv libcxxabi llvm-6.0.0.src/projects/
然后就可以开始cmake了,通过-G来指定ninja作为生成器。其中,-DLLVM_BINUTILS_INCDIR 是为了将BINUTILS的头文件引入,也就是我们的gold-plugin。。
sudo mkdir build-6.0
cd build-6.0/
sudo cmake -G Ninja -DLIBCXX_ENABLE_SHARED=OFF -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86" -DLLVM_BINUTILS_INCDIR=/usr/include ../llvm-6.0.0.src
然后开始编译,这个编译期间可能会占用大量内存,虚拟机不一定能成功编译,请使用ninja -j2之类的语句来限定编译的作业数。我的电脑8G内存,跑起来还是很容易内存爆炸。
sudo ninja
sudo ninja install
然后就安装结束了,查看一下版本看看是否安装成功即可。
clang --version
还有一件事,安装的时候如果没有设置 -DCMAKE_INSTALL_PREFIX 属性的话,会默认在usr/local下install。所以为了把诸如LLVMgold.so文件变为全局的,需要将相应的文件复制到usr/lib下。
sudo mkdir /usr/lib/bfd-plugins
sudo cp /usr/local/lib/libLTO.so /usr/lib/bfd-plugins
sudo cp /usr/local/lib/LLVMgold.so /usr/lib/bfd-plugins