一直苦恼于使用gcc4.8.1以上版本编译出的程序的可移植性问题,上次使用了Obfuscator之后觉得使用clang+llvm或许是个好路子
目标:
构建一条clang+llvm编译工具链,该工具链
1. 生成的程序不依赖gcc(libstdc++/libgcc_s等)
2. 工具链本身不需要依赖gcc4.8.1以上的支持(运行编译工具本身)
网上搜了些类似教程(1/2/3/4),都不能照做成功,综合各方面做了些修正,现在得到了想要的工具链,能在公司的CentOS6.2上使用,编译出的程序可在初装的裸机CentOS6.2上运行,记录下编译过程
准备工作
- yum install
sudo yum install gcc gcc-c++ make automake autoconf libtool
sudo yum install python python-devel - 下载cmake
- 下载ninja
- 下载gcc4.9.3源码
- 下载python2.7.10源码
- 下载llvm3.7.0源码(lld可以编译过,lldb暂时没有编过,其他openmp和polly不知道干啥的没有下载)
构建gcc4.9.3
- 解压
- 编译
-
安装
cd gcc-4.9.3
./contrib/download_prerequisites
cd ..
mkdir gcc-4.9.3-build
cd gcc-4.9.3-build
../gcc-4.9.3/configure –enable-languages=c,c++ –disable-multilib
make -j4
sudo make install
更新python2.7.10
- 解压
- 编译
- 安装
-
修改软连接
./configure
make
sudo make install
sudo mv /usr/bin/python /usr/bin/python2.6.6
sudo ln -s /usr/local/bin/python /usr/bin/python
使用gcc4.9.3构建Clang3.7.0
- 解压
tar xf llvm-3.7.0.src.tar.gz
mv llvm-3.7.0.src llvm
cd llvm
mkdir -p tools/clang
mkdir -p tools/clang/tools/extra
mkdir -p projects/compiler-rt
tar xf cfe-3.7.0.src.tar.xz -C tools/clang –strip-components=1
tar xf compiler-rt-3.7.0.src.tar.xz -C projects/compiler-rt –strip-components=1
tar xf lldb-3.7.0.src.tar.xz -C tools/clang/tools/extra –strip-components=1 - 使用附件中的patch/llvm_1目录对llvm目录进行替换
- 在llvm所在目录创建build目录
mkdir llvm_built_by_gcc
cd llvm_built_by_gcc - 编译安装(注意更改PREFIX目录)
cmake -G Ninja -DCMAKE_INSTALL_PREFIX=~/clang/3.7.0/gcc -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ -DLLVM_ENABLE_ZLIB=OFF -DCMAKE_BUILD_TYPE=”Release” -DCMAKE_CXX_FLAGS=”-std=c++11” -DLLVM_TARGETS_TO_BUILD=”X86” -DLLVM_PARALLEL_COMPILE_JOBS=4 -DLLVM_PARALLEL_LINK_JOBS=4 ../llvm
ninja
ninja install - 加入crtBegin/crtEnd文件(将附件中crt文件夹中的*.o文件拷贝到)~/clang/3.7.0/gcc/lib/clang/3.7.0/
- 安装到/usr/local
sudo cp -r ~/clang/3.7.0/gcc/* /usr/local
构建libunwind/libc++/libc++abi
-
build libunwind
tar xf libunwind-3.7.0.src.tar.xz
mv libunwind-3.7.0.src libunwind
cd libunwind
mkdir build
cd buildcmake -G Ninja -DCMAKE_C_COMPILER=clang ..
ninjacp -r ../include/* ~/clang/3.7.0/usr/include/
cp -lib/* ~/clang/3.7.0/usr/lib64 build libcxx using libsupc++
1) patch libcxx(使用path/libcxx打补丁)
2) 创建编译目录
cd libcxx
mkdir built_supc++
cd built_supc++
3) 编译
cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_INSTALL_PREFIX=~/clang/3.7.0/usr -DLIBCXX_CXX_ABI=libsupc++ -DLIBCXX_LIBSUPCXX_INCLUDE_PATHS=”/usr/local/include/c++/4.9.3/;/usr/local/include/c++/4.9.3/x86_64-unknown-linux-gnu/” -DCMAKE_BUILD_TYPE=Release ..
ninja
ninja install
4) 安装
mv ~/clang/3.7.0/usr/lib ~/clang/3.7.0/usr/lib64
sudo cp -r ~/clang/3.7.0/usr/* /usr/build libcxxabi using libcxx
1) patch libcxxabi(使用path/libcxxabi打补丁)
2) 编译
cd libcxxabi/lib
./buildit
3) 安装
ln -s libc++abi.so.1.0 libc++abi.so.1
ln -s libc++abi.so.1 libc++abi.so
cp ../include/* ~/clang/3.7.0/usr/include/
cp libc++* ~/clang/3.7.0/usr/lib64/
sudo cp -r ~/clang/3.7.0/usr/* /usr/build libcxx using libcxxabi
1) patch libcxx(使用path/libcxx打补丁)
2) 编译动态库
mkdir built_cxxabi_shared
cd built_cxxabi_shared
cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_INSTALL_PREFIX=~/clang/3.7.0/usr -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_LIBCXXABI_INCLUDE_PATHS=”/usr/include” -DCMAKE_BUILD_TYPE=Release ..
ninja
ninja install
3) 编译静态库
mkdir built_cxxabi_static
cd built_cxxabi_static
cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_INSTALL_PREFIX=~/clang/3.7.0/usr -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_LIBSUPCXX_INCLUDE_PATHS=”/usr/include” -DCMAKE_BUILD_TYPE=Release -DLIBCXX_ENABLE_SHARED=OFF ..
ninja
ninja install
4) 安装
mv ~/clang/3.7.0/usr/lib ~/clang/3.7.0/usr/lib64
sudo cp -r ~/clang/3.7.0/usr/* /usr/
到这个时候,llvm_built_by_gcc这只鸡可以使用-stdlib=libc++来下出不依赖gcc的蛋,接下来,用这只鸡下一个llvm_built_by_clang蛋,这样编译器本身也就不依赖高版本gcc了
使用Clang3.7.0构建Clang3.7.0
- 使用附件中的patch/llvm_2目录对llvm目录进行替换
- 在llvm所在目录创建build目录
mkdir llvm_built_by_clang
cd llvm_built_by_clang - 编译安装(注意更改PREFIX目录)
cmake -G Ninja -DCMAKE_INSTALL_PREFIX=~/clang/3.7.0/clang -DCMAKE_C_COMPILER=/usr/local/bin/clang -DCMAKE_CXX_COMPILER=/usr/local/bin/clang++ -DLLVM_ENABLE_ZLIB=OFF -DCMAKE_BUILD_TYPE=”Release” -DCMAKE_CXX_FLAGS=”-std=c++11 –stdlib=libc++” -DLLVM_TARGETS_TO_BUILD=”X86” -DLLVM_PARALLEL_COMPILE_JOBS=4 -DLLVM_PARALLEL_LINK_JOBS=4 ../llvm
ninja
ninja install - 加入crtBegin/crtEnd文件(将附件中crt文件夹中的*.o文件拷贝到)~/clang/3.7.0/gcc/lib/clang/3.7.0/
- 安装到/usr/local
sudo cp -r ~/clang/3.7.0/gcc/* /usr/local
大功告成