llvm源码编译
0x00 获取llvm源码
获取llvm
项目源码:git clone https://github.com/llvm/llvm-project.git
但是,该项目较大,且直接从github下载源码可能会超时失败。可利用gitee的镜像项目进行clone:git clone --depth 1 https://gitee.com/mirrors/LLVM.git
。
–depth 1,进行浅层克隆,获取LLVM项目的最新版本。
详细参见:https://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm
0x01 构建cmake
cd LLVM
mkdir build
cd build
cmake -G Ninja -DLLVM_ENABLE_PROJECTS="clang;lld" -DLLVM_TARGETS_TO_BUILD="X86" -DCMAKE_BUILD_TYPE=Debug -DLLVM_INCLUDE_TESTS=OFF -DLLVM_ENABLE_RTTI=ON -DCMAKE_INSTALL_PREFIX="/path/to/llvm" -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON ../llvm
编译选项:
- -DLLVM_ENABLE_PROJECTS:指定要额外构建的子项目,否则只编译基本的llvm项目。"clang;lld"指定在构建过程中会启用 Clang 编译器前端和 LLD 链接器这两个子项目。Clang 是一个 C/C++/Objective-C 编译器,而 LLD 是 LLVM 项目中的链接器。
- -DLLVM_TARGETS_TO_BUILD:指定要构建的目标架构。
- -DCMAKE_BUILD_TYPE=Debug: 可选的参数有Release/Debug/RelWithDebInfo/MinSizeRel。Debug意味着构建将包含调试信息,并且优化级别较低,便于调试。
- -DLLVM_INCLUDE_TESTS=OFF: 不编译测试代码,可以减少构建时间和最终输出的大小。
- -DLLVM_ENABLE_RTTI=ON: 启用运行时类型信息 (RTTI),这是 C++ 中的一种特性,允许程序在运行时查询对象的类型。
- …/llvm: 这是 CMake 项目的源代码目录,指定为
llvm-project/llvm
。 - -DCMAKE_INSTALL_PREFIX:自定义安装路径。
cmake的环境变量配置(适用于cmake的自定义安装路径)
# 将cmake的安装路径添加至环境变量(临时)
export PATH=/path/to/cmake/bin:$PATH
# 导入.bashrc或.zshrc文件中(永久生效)
echo 'export PATH=/usr/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
0x02 编译llvm
# 指定并行任务数, $(nproc)可用于获取当前系统中的CPU核心数
# 编译过程中会出现一些警告, 只要不报错就行。
# 8核CPU+16G内存编译了将近2个小时。为了加快编译速度,初始阶段可以不设置最大线程数。当发生错误时,通常是内存不足引起的,可尝试通过-j参数控制并行线程数,但编译速度会降低。
ninja -j x
# 安装llvm
ninja install
# 检查llvm是否安装成功
llvm-config --version
编译过程中,因内存不足所引起的报错如下: