我使用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 ++语言
O.S:Ubuntu 14.04 LTS,64位
输出(测试代码):
找不到RTN
找不到RTN
找不到RTN
答案 0 :(得分:2)
您所看到的(用字符包装的函数名称)称为函数名称修饰/修改。这是C ++本地实现重载的方式。不幸的是,mangling没有标准化,每个编译器都以不同的方式完成。
您可以查找损坏的名称,也可以迭代图像中的rtns(您可以在工具包中看到如何执行此操作的示例)并使用Pin的PIN_UndecorateSymbolName API来获取干净的函数名称。请记住,由于损坏你可能会得到不止一个这样的符号。