首页 > 解决方案 > 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);

得到:调用带有错误签名的函数!"'失败。

请帮助以正确的方式执行此操作

标签: c++llvmllvm-irllvm-c++-api

解决方案


@arnt 是正确的。我猜你想要“addr”作为你的钩子函数的 int。请记住,这个地址不能由编译器静态确定,但它是一个动态地址。因此,您需要将 args 替换为以下内容:

ArrayRef< Value* > args(CastInst::CreateIntegerCast(addr, F->getFunctionType()->getFunctionParamType(0), true, "", InsertPoint))

您可以使用您的 IRBuilder 来执行此操作。这实际上是一个新指令,用于将“addr”动态转换为整数,然后您可以将其传递给您的钩子函数。


推荐阅读