c++ - LLVM | 插入带有 uintptr_t 参数的钩子函数
问题描述
我想插入以下功能:
void foo(uintptr_t addr) {}
函数类型声明:
std::vector<llvm::Type*> params = {Type::getInt64Ty(Context)};
FunctionType* funcTy = FunctionType::get(Type::getVoidTy(Context), params, false);
呼叫插入:
llvm::IRBuilder<> builder(I);
builder.SetInsertPoint(bb, ++builder.GetInsertPoint());
// uintptr_t addr = 123213
ArrayRef< Value* > args(ConstantInt::get(Type::getInt64Ty(llvmContext), addr, false));
builder.CreateCall(F,args);
得到:调用带有错误签名的函数!"'失败。
请帮助以正确的方式执行此操作
解决方案
@arnt 是正确的。我猜你想要“addr”作为你的钩子函数的 int。请记住,这个地址不能由编译器静态确定,但它是一个动态地址。因此,您需要将 args 替换为以下内容:
ArrayRef< Value* > args(CastInst::CreateIntegerCast(addr, F->getFunctionType()->getFunctionParamType(0), true, "", InsertPoint))
您可以使用您的 IRBuilder 来执行此操作。这实际上是一个新指令,用于将“addr”动态转换为整数,然后您可以将其传递给您的钩子函数。
推荐阅读
- matlab - 在不使用工具箱的情况下对非常大的数字求和
- python - Django2.1:在 ModelForm 中查询集 ModelChoice 然后保存两个表单
- firmware - 对于 S2-LP,函数 SIGFOX_API_start_continuous_transmission(frequency, mode) 的频率格式是什么
- kubernetes - Ingress 如何代理 kubernetes 之外的服务?
- applescript - OSX applescript - 检查焦点应用程序是否不是finder,否则不执行命令
- javascript - 我如何在反应中将状态赋予外部变量?
- python - 我需要找到该列的最大值,并且需要确定具有最大值的人的名字和姓氏
- python - Django:如何使用模板为每个 HTML 页面添加标题,并且只更新一个中心文件?
- javascript - 身体背景模糊功能不适用于多种模式
- docker - AWS EKS kubernetes 集群中的守护进程不支持 docker buildkit