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

LLVM 4.0中如何将IR局部变量(如%10)传入挂钩函数?

问题:LLVM 4.0中如何将IR局部变量值传入挂钩函数?

嘿,我来帮你解决这个问题!你现在的核心问题是用错了API——CreateGlobalStringPtr是用来生成字符串常量指针的,完全不是用来获取局部变量值的,所以那行代码才会出错。下面是具体的修改方案和解释:

首先,先回顾下你的现有代码(标注了错误行):

hookFunc2 = M.getOrInsertFunction("funcName", Type::getVoidTy(M.getContext()), Type::getInt8PtrTy(M.getContext()), NULL);
hook1 = cast<Function>(hookFunc2);
IRBuilder<> builder1(a); // where a is the basic block pointer
BasicBlock::iterator BC = a->begin();
builder1.SetInsertPoint(&(*BC));
Value* args = builder1.CreateGlobalStringPtr(%10); // ❌ 这里错误,你需要获取%10的值
builder1.CreateCall(hook1, args);

正确的修改步骤:

  1. 获取对应%10的Value*对象
    LLVM IR里的每个局部变量(比如%10)都是Value类的实例,你需要先拿到指向这个实例的指针:

    • 如果%10是某个指令的结果(比如%10 = add i32 %8, %9),可以直接引用那个指令的Value*;
    • 如果你不确定它的位置,可以遍历基本块的指令来找到它。
  2. 类型转换匹配挂钩函数的参数
    你的挂钩函数参数是i8*,如果%10不是指针类型(比如是整数类型),需要先把它转换成i8*;如果本身就是指针类型,直接做位转换即可。

修改后的完整代码示例:

hookFunc2 = M.getOrInsertFunction("funcName", Type::getVoidTy(M.getContext()), Type::getInt8PtrTy(M.getContext()), NULL);
hook1 = cast<Function>(hookFunc2);
IRBuilder<> builder1(a);
BasicBlock::iterator BC = a->begin();
builder1.SetInsertPoint(&(*BC));

// 第一步:获取指向%10的Value*对象
// 示例1:如果你知道%10是基本块a里的第10个值(索引从0开始是9)
Value* localVar = &*(std::next(a->begin(), 9));

// 示例2:遍历指令查找(更可靠,避免依赖临时名称%10)
// for (Instruction &inst : *a) {
//     // 可以通过指令类型、操作数等特征定位,比如是LoadInst或者某个计算指令
//     if (auto *loadInst = dyn_cast<LoadInst>(&inst)) {
//         localVar = loadInst;
//         break;
//     }
// }

// 第二步:将局部变量转换为挂钩函数需要的i8*类型
Value* argForHook;
if (!localVar->getType()->isPointerTy()) {
    // 如果是整数类型,转换为指针
    argForHook = builder1.CreateIntToPtr(localVar, Type::getInt8PtrTy(M.getContext()));
} else {
    // 如果是指针类型,位转换为i8*
    argForHook = builder1.CreateBitCast(localVar, Type::getInt8PtrTy(M.getContext()));
}

// 第三步:调用挂钩函数
builder1.CreateCall(hook1, argForHook);

关键注意事项:

  • 不要依赖%10这个临时名称:LLVM的优化过程可能会改变这些临时变量的编号,所以最好通过指令的语义(比如它是加载某个内存的指令,或者是某个计算的结果)来定位目标变量,而不是靠编号。
  • 类型必须严格匹配:挂钩函数的参数是i8*,所以传入的参数类型必须完全一致,否则LLVM会报错。根据原变量的类型选择CreateIntToPtr(整数转指针)或CreateBitCast(指针间位转换)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:55:01