从理论上想想,我们也会觉得,只要安装好了 LLVM 的库,就可以编译 LLVM Pass 了。 然而,官方文档里给的示例 Writing an LLVM Pass 是需要把 Pass 的源代码放在LLVM项目中一起编译的。 所以我盲信官方研究了一天如何编译 LLVM 以及 Clang (手动微笑)。 更夸张的是,LLVM和Clang在默认配置参数 (Debug模式) 下会...
常用命令 打印每个pass中间的结果: clang-S -mllvm -print-after-all -o - &> log.ll 查看某种pass之后的结果: clang -mllvm -print-after=[passName] -o - &> log.ll 查看所有pass调用情况: clang -mllvm --debug-pass=Structure opt -gvn -debug-pass-manager <1.bc 调试某个pass,打印debug信息...
所以release版的opt是能够加载debug的pass的。接下来就好办了。 3.断点调试 官网文档上(https://llvm.org/docs/WritingAnLLVMPass.html)说的是可以再llvm::PassManager::run函数上下断点,然后加载pass。但是官网文档可能有点旧了,这个函数不存在了: gef➤breakllvm::PassManager::run Function"llvm::PassManager:...
-mllvm指定将后一个选项传递给llvm. 因为默认执行的clang其实是一个driver, 在运行中调用对应的程序执行前端分析(clang), 中端优化指令选择(llvm)以及汇编链接(assembler & linker). -debug选项即将llvm中DEBUG宏输出到stderr. 如果我们只想需要某个特定pass的打印可以使用-debug-only选项(后接pass的DEBUG_TYPE). ...
3:backend,后端,这里LLVM 会通过一个一个的pass去优化,每个pass做一些事情,最终生成汇编代码 4:assembler,生成object目标文件,也就是我们熟知的.o文件。 5:linker,链接,将各个.o文件以及需要的动态库和静态库链接起来,最终生成可执行文件Mach-o 6:bind-arch,针对不同的架构,会生成对应的Mach-o可执行文件。
编译LLVMFirstPass 成功之后,动态库保存在 build/Debug/lib/LLVMFirstPass.dylib。 3. 使用 opt 加载和调试 Pass (1) 编写一段测试代码: #include<stdio.h>inttest(){printf("test\n");return0; }intmain(){intnum =1;printf("main %d\n", num);test();return0; ...
Pass最初的例子就在:llvm源码/lib/Transform/Hello/Hello.cpp。 可以采用命令 $ opt -load ../../../Debug+Asserts/lib/Hello.so -hello < hello.bc > /dev/null 去运行这个Pass,并且查看效果。 ../../../Debug+Asserts/lib/Hello.so是so的目录,在llvm3.1中,这个例子的名称已经变成了LLVMHello.so....
xcrun clang main.m -save-temps -v -mllvm -debug-pass=Structure -fsanitize-coverage=trace-pc-guard 输出如下所示(有删减): clang -cc1 -E --fsanitize-coverage-type=3 -fsanitize-coverage-trace-pc-guard main.mi -x objective-c main.m ...
xcrun clang main.m -save-temps -v -mllvm -debug-pass=Structure -fsanitize-coverage=trace-pc-guard 1. 输出如下所示(有删减): AI检测代码解析 clang -cc1 -E --fsanitize-coverage-type=3 -fsanitize-coverage-trace-pc-guard main.mi -x objective-c main.m ...
导语:Objective-C在函数hook的方案比较多,但通常只实现了函数切片,也就是对函数的调用前或调用后进行hook,这里介绍一种利用llvm pass进行静态插桩的另外一种思路,希望起到抛砖引玉的作用,拿来实现更多有意思的功能。 Objective-C中的常见的函数Hook实现思路 ...