You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows环境下如何通过Clang仅加载bogus-control-flow Pass插件?

仅加载指定LLVM Pass的Clang参数配置及代码修改方案

问题原因分析

  • 原命令-passes=bogus-control-flow报错,是因为该参数属于Clang前端而非clang++顶层参数,未通过-Xclang传递给前端处理。
  • 改用-mllvm --bogus-control-flow后加载全部Pass,是因为注册代码中PB.registerPipelineStartEPCallback会在优化流水线启动时强制添加所有混淆Pass,覆盖了指定单个Pass的操作;同时该参数是针对传统Pass体系的选项,不适用于新PassManager的注册方式。

解决方案

1. 修改Pass注册代码

移除自动添加所有Pass的registerPipelineStartEPCallback回调,仅保留通过Pass名称解析加载的逻辑,确保只有明确指定的Pass才会被加载。修改后的代码如下:

llvm::PassPluginLibraryInfo getBronyaObfusPluginInfo() {
  return {LLVM_PLUGIN_API_VERSION, "BronyaObfus", "v0.1", [](PassBuilder &PB) {
            PB.registerPipelineParsingCallback(
                [](StringRef PassName, FunctionPassManager &FPM, ...) {
                  if (PassName == "bogus-control-flow") {
                    FPM.addPass(BogusControlFlowPass());
                    return true;
                  }

                  if (PassName == "flattening") {
                    FPM.addPass(FlatteningPass());
                    return true;
                  }

                  if (PassName == "mba-obfuscation") {
                    FPM.addPass(MBAObfuscationPass());
                    return true;
                  }
                  return false;
                });

            PB.registerPipelineParsingCallback(
                [](StringRef PassName, ModulePassManager &MPM, ...) {
                  if (PassName == "string-obfuscation") {
                    MPM.addPass(StringObfuscationPass());
                    return true;
                  }
                  return false;
                });
          }};
}

extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo() {
  return getBronyaObfusPluginInfo();
}

2. 使用正确的Clang命令

通过-Xclang将-passes参数传递给Clang前端,指定仅运行bogus-control-flow Pass。根据需求选择以下命令:

  • 仅运行bogus-control-flow Pass(无其他优化):
.\bin\clang++.exe -O0 -Xclang -fpass-plugin='./BronyaObfus.dll' -Xclang -passes='bogus-control-flow' .\test.cpp -o .\a.exe
  • 在O1优化流水线后运行bogus-control-flow Pass:
.\bin\clang++.exe -O1 -Xclang -fpass-plugin='./BronyaObfus.dll' -Xclang -passes='default<O1>,bogus-control-flow' .\test.cpp -o .\a.exe

注意:若LLVM版本较旧,可能需添加-fexperimental-new-pass-manager参数强制启用新PassManager,新版本通常已默认启用。

内容的提问来源于stack exchange,提问作者I3r0nya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:10:58