1

我使用 RTN_FindByName() 来搜索特定的 RTN,但它对我不起作用,而且我尝试强制编译器不内联 RTN,但仍然无法工作,
测试代码:

void __attribute__ ((noinline)) MyFunInApp() 
{
  printf(" function inside application environmental \n");
}

pintool中的代码:

VOID ImageLoad(IMG img, VOID *v)
 {
   RTN MyRtn = RTN_FindByName(img,"MyFunInApp");
   if (RTN_Valid(MyRtn))
    {
      cout<< "Found RTN"<< endl;
    }
    else
    {
      cout<< "Not Found RTN"<< endl;
    }
}

我该如何解决这个问题,或者通过其他方式做到这一点?

编译器:gcc 版本 4.8
C++ 语言
操作系统:Ubuntu 14.04 LTS,64 位
输出(测试代码):
未找到 RTN
未找到 RTN
未找到 RTN

4

1 回答 1

2

您所看到的(用字符包裹的函数名称)称为函数名称修饰/修饰。这是 C++ 本地实现重载的方式。不幸的是,修饰不是标准化的,每个编译器的做法都不同。

您可以查找损坏的名称,也可以遍历图像中的 rtns(您可以在套件中查看有关如何执行此操作的示例)并使用 Pin 的 PIN_UndecorateSymbolName API 来获取干净的函数名称。请记住,由于损坏,您可能会得到多个这样的符号。

于 2015-08-11T13:08:44.483 回答