如何将 LLVMPass long opt 命令更改为简单命令
Posted
技术标签:
【中文标题】如何将 LLVMPass long opt 命令更改为简单命令【英文标题】:How to change LLVMPass long opt command to a simple Command 【发布时间】:2015-04-29 14:26:10 【问题描述】:我正在从事 LLVM 混淆项目。我已经编写了一个 llvm 通行证(可以说是流平通通行证),我正在使用以下命令在源代码(test.c)上运行:
clang -emit-llvm test.c -c -o test.bc
opt -load ../../.. LLVMFlattening.so -fla <test.bc>/dev/null
但我已经看到,在 O-LLVM 项目中,他们使用以下方法实现了相同的目标:
clang -emit-llvm test.c -c -o test.bc -mllvm -fla
谁能告诉我这里的 -mllvm 是什么以及它是如何变成一个简单命令的?
【问题讨论】:
【参考方案1】:-mllvm
表示Additional arguments to forward to LLVM's option processing
。因此-mllvm -fla
会将-fla
传递给LLVM 的选项处理。
Clang 和 LLVM 可以分开运行。如果你想让 clang 运行 llvm,并且还有一些你想让 llvm 知道的选项。 -mllvm
是你需要的。
默认情况下,LLVM 不会打开所有转换通道。使用-fla
,LLVM 将通过调用函数RegisterPass<typename passName>
打开使用命令行参数fla
注册的通行证。
在您的命令行中,opt 的-load
选项用于加载插件。如果您想按预期使用简单的命令行。您的通行证需要链接到opt
二进制文件。这可以通过以下两种方式完成:
-
(不修改现有的 LLVM 源代码树):通过添加
CMakeLists.txt
在此 link 中提到的添加您唯一通行证的源代码
直接将你的pass源代码文件夹复制到<LLVM root>/lib/Transform
目录下。并修改<LLVM root>/lib/Transform/CMakeLists.txt
,像其他人一样添加add_subdirectory(<pass name>)
行。
【讨论】:
但是他们如何在 -mllvm 中添加 -fla(流平通道标志)。我不想使用 opt 命令来使用我的 llvmPass llvm 加载路径在哪里? 对不起,我弄错了,您的密码可以与现有的opt
二进制文件链接在一起以完成此操作。我已经更新了我的答案。
我试过了,但不知道为什么它不起作用。即使按照建议添加了所有内容,-mllvm 也没有打开 -fla。
什么是`选项处理`?它是命令行参数解析器吗?我在哪里可以了解更多信息?可以向它传递哪些额外的参数?【参考方案2】:
我最近正在研究 O-LLVM,并且遇到了同样的问题。这是我的解决方案:
1.将static cl::opt<bool> YOUR_FLA("fla", cl::init(false),"info...")
添加到PassManagerBuilder.cpp
2.在你的混淆传递源代码中添加函数Pass *createYOUR_FLA(bool flag)
3.在PassManagerBuilder.cpp
中添加MPM.add(createYOUR_FLA(YOUR_FLA));
到函数populateModulePassManager
上面的解决方案适用于我的简单通行证。
【讨论】:
嗨,你能再解释一下吗,我想在加载我的 llvm 通行证时传递参数以上是关于如何将 LLVMPass long opt 命令更改为简单命令的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Long 数据类型变量中设置 Optional<Long> 数据类型变量值? [关闭]
c语言中如何将short,int,long,float这些类型的数值转换为字符串?