我花了很多时间阅读 LLVM 源代码树。这是一项令人印象深刻的工程!
无论如何,我一直在尝试将我拥有的一些 MachO Arm 二进制文件转换为 LLVM 位码以进行基本的静态分析。主要是,我想根据使用的寄存器在某些调用上创建反向静态切片。此外,我正在尝试对明显的常量进行前向传播(例如,从符号表中加载函数名并传递给寄存器)。
此时,我已经能够使用以下命令行转储文件并在本机 ARM 程序集中对其进行解析:
bash-3.2$ llvm-objdump -d ~/code/osx/HelloWorldThin -triple=thumb
-mattr=+thumb2,+32bit,+v7,+v6t2,+thumb-mode,+neon
/Users/steve/code/osx/HelloWorldThin: file format Mach-O arm
Disassembly of section __TEXT,__text:
_main:
2fd4: f0 b5 push {r4, r5, r6, r7, lr}
2fd6: 03 af add r7, sp, #12
2fd8: 4d f8 04 8d str r8, [sp, #-4]!
2fdc: 0d 46 mov r5, r1
2fde: 06 46 mov r6, r0
2fe0: 00 f0 fe ef blx #4092
……剪断了……
这很棒,因为它为我节省了大量编写解析器的时间!
在查看了 MachODump.cpp 之后,我看到这些被降低为 MCInst,从我理解的方式来看,它只是一个带参数的解析操作码。
所以我的问题是:
1)有没有办法从 ARM 转换为 LLVM(用于优化传递等)?不需要回传给ARM,只需要有一个分析结果。
1.5) 我注意到所有的分析操作都是在指令而不是 MCInst 上进行的,有没有办法键入提升并提供所需的信息?
2) 有没有办法模拟/模拟 ARM 或 LLVM 指令?我问是因为像切片和常量传播这样的事情需要数据流分析才能确定内存和寄存器中的内容。
像这样的操作需要跟踪从内存中加载和存储数据的方式以及寄存器。LLVM 能否理解这些分析指令的副作用?
__text:000032DE LDR R1, [R0] ; "viewDidLoad"
__text:000032E0 MOV R0, SP
__text:000032E2 BLX _objc_msgSendSuper2
3) 如果我似乎对 LLVM 中发生的事情有根本的误解,我希望得到任何反馈。
谢谢,如果我可以提供有关我的问题的更多信息,请告诉我。