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);
正确的修改步骤:
获取对应%10的
Value*对象
LLVM IR里的每个局部变量(比如%10)都是Value类的实例,你需要先拿到指向这个实例的指针:- 如果%10是某个指令的结果(比如
%10 = add i32 %8, %9),可以直接引用那个指令的Value*; - 如果你不确定它的位置,可以遍历基本块的指令来找到它。
- 如果%10是某个指令的结果(比如
类型转换匹配挂钩函数的参数
你的挂钩函数参数是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
相关产品推荐
相关产品推荐

