您的位置:首页 > 运维架构 > Linux

CentOS6.2编译llvm3.7.0

2015-12-14 16:34 465 查看
一直苦恼于使用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 build

cmake -G Ninja -DCMAKE_C_COMPILER=clang ..

ninja

cp -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

大功告成

二进制包

clang+llvm

unwind/libcxx/libcxxabi

code patch

crtBegin/crtEnd(来源)(地址)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: