项目简介
本项目是一个静态(AOT)二进制文件提升工具,能够将X86 - 64和Arm32的Linux/ELF库和可执行文件提升为LLVM IR。当前仅支持Linux/ELF二进制文件的提升,后续有计划扩展到Windows、OS X和C++二进制文件。
项目的主要特性和功能
支持架构
- X86 - 64
- Arm32
支持特性
- 可变参数函数调用(如printf)
- 函数原型发现
- 栈帧抽象
- 跳转表(switch语句)
- 共享库
已知问题
- 目前不支持SIMD指令(如SSE、AVX、Neon)
- 主要测试使用LLVM编译的二进制文件,对GCC编译的代码测试有限
安装使用步骤
假设用户已经下载了本项目的源码文件。
1. 复制LLVM和llvm - mctoll仓库
sh
2. 切换到测试过的LLVM版本
sh
git checkout <hash from LLVMVersion.txt>
3. 使用CMake生成Ninja项目并构建llvm - mctoll
sh
mkdir build && cd build
cmake -G "Ninja" -DLLVM_TARGETS_TO_BUILD="X86;ARM" -DLLVM_ENABLE_PROJECTS="clang;lld" -DLLVM_ENABLE_ASSERTIONS=true -DCMAKE_BUILD_TYPE=Release ../llvm
ninja llvm-mctoll && ninja lld
4. 运行单元测试(仅限Linux)
sh
ninja check-mctoll
5. 使用llvm - mctoll提升二进制文件
sh
llvm-mctoll -d a.out
6. 检查提升后的LLVM IR的正确性
通过使用clang
编译提升后的LLVM IR并运行生成的可执行文件来检查其正确性。
参考文献
请在引用此工作时使用以下参考文献:
@inproceedings{10.1145/3316482.3326354,
author = {Yadavalli, S. Bharadwaj and Smith, Aaron},
title = {Raising Binaries to LLVM IR with MCTOLL (WIP Paper)},
year = {2019},
isbn = {9781450367240},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
url = {https://doi.org/10.1145/3316482.3326354},
doi = {10.1145/3316482.3326354},
booktitle = {Proceedings of the 20th ACM SIGPLAN/SIGBED International Conference on Languages, Compilers, and Tools for Embedded Systems},
pages = {213–218},
numpages = {6},
keywords = {Code Generation, LLVM IR, Binary Translation},
location = {Phoenix, AZ, USA},
series = {LCTES 2019}
}
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】