前言
眾所周知,C語言編譯器中础钠,Clang比GCC編譯速度更快恰力,編譯產(chǎn)出更小,出錯(cuò)提示更友好旗吁,所以能用Clang當(dāng)然就會(huì)用Clang踩萎。但是裝Clang還有一堆環(huán)境問題讓人頭疼,如果不是要用AFLGo很钓,我也懶得把帶有g(shù)old-plugin的LLVM這一套東西裝起來香府。踩了一些坑董栽,最終也算裝成了。網(wǎng)上的教程千奇百怪企孩,而且大部分比較老锭碳,最后我探索了一個(gè)比較簡潔的安裝方式,這里把安裝的過程記錄一下柠硕,方便日后回憶工禾。
我使用的是系統(tǒng)ubuntu 16.04 LTS,使用的是源碼安裝LLVM 6.0.0蝗柔。
安裝
在安裝前先保證系統(tǒng)中有make,cmake,ninja(一個(gè)代替make的編譯工具),python2.7,bitnutils(這個(gè)就是我們的gold-plugin)闻葵。
apt-get install make cmake ninja-build python2.7 binutils-gold binutils-dev
然后通過網(wǎng)站 http://releases.llvm.org/download.html 下載所需要的包(為什么不git或者svn下載?因?yàn)槲疫@下載太慢癣丧,用瀏覽器會(huì)快一些)槽畔。所需的包有(這里以6.0.0為例,如果是其他版本就在對(duì)應(yīng)版本下下載)胁编,:
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:其實(shí)libcxx和libcxxabi不用也可以用AFL的llvm模式厢钧,這里順便裝了而已。
下下來的包是tar.xz的兩層壓縮包嬉橙,通過xz和tar解壓($DOWNLOAD是包的位置):
cd $DOWNLOAD
xz -d 六個(gè)包
tar -xvf 六個(gè)包
然后把解壓的六個(gè)包放在一個(gè)文件夾中:
sudo mkdir src
for i in *.src; do sudo mv $i src/$i; done
cd src/
接著把目錄變得漂亮一些早直,為編譯做準(zhǔn)備:
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
然后開始編譯,這個(gè)編譯期間可能會(huì)占用大量內(nèi)存粪滤,虛擬機(jī)不一定能成功編譯斧拍,請(qǐng)使用ninja -j2之類的語句來限定編譯的作業(yè)數(shù)。我的電腦8G內(nèi)存杖小,跑起來還是很容易內(nèi)存爆炸肆汹。
sudo ninja
sudo ninja install
然后就安裝結(jié)束了,查看一下版本看看是否安裝成功即可予权。
clang --version
還有一件事昂勉,安裝的時(shí)候如果沒有設(shè)置 -DCMAKE_INSTALL_PREFIX 屬性的話,會(huì)默認(rèn)在usr/local下install伟件。所以為了把諸如LLVMgold.so文件變?yōu)槿值模枰獙⑾鄳?yīng)的文件復(fù)制到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