LLVMIRbitcode文件反编译
2023/8/26大约 2 分钟
脚本安装
使用官方安装脚本安装
仅适用于Debian/Ubuntu
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 13
使用包管理器安装
Ubuntu
先在/etc/apt/source.list
加入以下内容
deb http://apt.llvm.org/focal/ llvm-toolchain-focal-13 main
deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-13 main
然后执行以下shell命令
sudo apt update
sudo apt install clang-13
安装clang编译器时会自动安装所依赖的LLVM库,lldb等其他组件需要单独安装
macOS
brew install llvm
从源码编译安装
以LLVM 13.0.1为例
编译LLVM需要事先在系统中安装符合以下条件的软件
- CMake >= 3.4.3
- GCC >= 5.1.0
- Python >= 2.7
- zlib >= 1.2.3.4
- GNU Make >= 3.79
按照以下命令从源码编译安装LLVM
# 下载源码
wget https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/llvm-project-13.0.1.src.tar.xz
# 解压源码
tar xvf llvm-project-13.0.1.src.tar.xz
# 新建安装目录
sudo mkdir -p /usr/local/llvm
# 新建编译目录
sudo mkdir -p llvm-project-13.0.1.src/build
# 进入编译目录
cd llvm-project-13.0.1.src/build
# cmake生成编译信息
cmake -G "Unix Makefiles" -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE="Release" -DLLVM_INCLUDE_TESTS=OFF -DCMAKE_INSTALL_PREFIX="/usr/local/llvm" ../llvm
# 编译
cmake --build .
# 安装到安装目录
cmake --build . --target install
/usr/local/llvm
是安装目录(可自定义), llvm-project-13.0.1.src
是源码目录, llvm-project-13.0.1.src/build
是编译产物目录
这里用的构建工具是make,当然也可以用速度更快的ninja
使用
如果你想得到.s,可以执行命令:./llc baby.bc -o baby.s
如果你想得到.ll,可以执行命令:llvm-dis baby.bc -o baby.ll
如果你想得到可执行文件,可以执行命令:as baby.s
很多编译器可以从中间表示直接生成高级语言的c或fortran,如open64的whirl2c和whirl2f,但llvm是否支持从.ll文件或.bc文件到高级的.c呢?不多说,继续上图:

为了大家更清楚的看图,再归纳一下:
- a.c,源代码。
- a.bc,llvm的字节码的二进制形式。
- a.ll,llvm字节码的文本形式。
- a.s,机器汇编码表示的汇编文件。
- a.out,可执行的二进制文件。