CentOS6.2编译llvm3.7.0

时间:2022-04-19 13:02:44

一直苦恼于使用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上运行,记录下编译过程

准备工作

  1. yum install
    sudo yum install gcc gcc-c++ make automake autoconf libtool
    sudo yum install python python-devel
  2. 下载cmake
  3. 下载ninja
  4. 下载gcc4.9.3源码
  5. 下载python2.7.10源码
  6. 下载llvm3.7.0源码(lld可以编译过,lldb暂时没有编过,其他openmp和polly不知道干啥的没有下载)

构建gcc4.9.3

  1. 解压
  2. 编译
  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

  1. 解压
  2. 编译
  3. 安装
  4. 修改软连接

    ./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

  1. 解压
    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
  2. 使用附件中的patch/llvm_1目录对llvm目录进行替换
  3. 在llvm所在目录创建build目录
    mkdir llvm_built_by_gcc
    cd llvm_built_by_gcc
  4. 编译安装(注意更改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
  5. 加入crtBegin/crtEnd文件(将附件中crt文件夹中的*.o文件拷贝到)~/clang/3.7.0/gcc/lib/clang/3.7.0/
  6. 安装到/usr/local
    sudo cp -r ~/clang/3.7.0/gcc/* /usr/local

构建libunwind/libc++/libc++abi

  1. 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

  2. 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/

  3. 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/

  4. 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

  1. 使用附件中的patch/llvm_2目录对llvm目录进行替换
  2. 在llvm所在目录创建build目录
    mkdir llvm_built_by_clang
    cd llvm_built_by_clang
  3. 编译安装(注意更改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
  4. 加入crtBegin/crtEnd文件(将附件中crt文件夹中的*.o文件拷贝到)~/clang/3.7.0/gcc/lib/clang/3.7.0/
  5. 安装到/usr/local
    sudo cp -r ~/clang/3.7.0/gcc/* /usr/local

大功告成

二进制包

  1. clang+llvm
  2. unwind/libcxx/libcxxabi
  3. code patch
  4. crtBegin/crtEnd(来源)(地址)