【问题标题】:LLVM | insert hook function with uintptr_t argumentLLVM |插入带有 uintptr_t 参数的钩子函数
【发布时间】:2021-08-07 13:08:55
【问题描述】:

我想插入下面​​的函数:

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);

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

请帮助正确的方法

【问题讨论】:

  • 你添加的参数是一个int,不是指向int的指针。
  • 谢谢,但您能否更具体地说明我需要更改的确切代码?
  • 是的,一周后我回到键盘前。
  • 嗯,我回来了,但仔细检查后,我认为我不能给你确切的代码。 Youc 调用ConstantInt::get() 会从一个常量整数中为您提供一个常量整数。这意味着你有一个常量整数,但你想要的甚至不是一个整数,它是一个指向整数的指针。您是否尝试通过引用传递整数?我不知道你想做什么。

标签: c++ llvm llvm-ir llvm-c++-api


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2020-03-19
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2019-04-14
    • 2020-09-13
    相关资源
    最近更新 更多