【问题标题】:How to change LLVMPass long opt command to a simple Command如何将 LLVMPass long opt 命令更改为简单命令
【发布时间】: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 是什么以及它是如何变成一个简单命令的?

【问题讨论】:

    标签: llvm llvm-clang


    【解决方案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&lt;typename passName&gt; 打开使用命令行参数fla 注册的通行证。

    在您的命令行中,opt 的-load 选项用于加载插件。如果您想按预期使用简单的命令行。您的通行证需要链接到opt 二进制文件。这可以通过以下两种方式完成:

    1. (不修改现有的 LLVM 源代码树):通过添加 CMakeLists.txt 在此 link 中提到的添加您唯一通行证的源代码
    2. 直接将你的pass源代码文件夹复制到&lt;LLVM root&gt;/lib/Transform目录下。并修改&lt;LLVM root&gt;/lib/Transform/CMakeLists.txt,像其他人一样添加add_subdirectory(&lt;pass name&gt;)行。

    【讨论】:

    • 但是他们如何在 -mllvm 中添加 -fla(流平通道标志)。我不想使用 opt 命令来使用我的 llvmPass
    • llvm 加载路径在哪里?
    • 对不起,我弄错了,您的密码可以与现有的opt 二进制文件链接在一起以完成此操作。我已经更新了我的答案。
    • 我试过了,但不知道为什么它不起作用。即使按照建议添加了所有内容,-mllvm 也没有打开 -fla。
    • 什么是`选项处理`?它是命令行参数解析器吗?我在哪里可以了解更多信息?可以向它传递哪些额外的参数?
    【解决方案2】:

    我最近正在研究 O-LLVM,并且遇到了同样的问题。这是我的解决方案:

    1.将static cl::opt&lt;bool&gt; 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 通行证时传递参数
    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2016-03-17
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多