我试图在特定例程中迭代基本块,但我发现了一些问题:
VOID Routine(RTN rtn, VOID *v)
{
RTN_Open(rtn)
for (BBL bbl = RTN_BblHead(rtn); BBL_Valid(bbl); bbl = BBL_Next(bbl))
{ /* some code */ }
RTN_Close(rtn);
}
错误:不推荐使用的声明,
我该如何解决该错误,或者通过其他方式来解决?
我试图在特定例程中迭代基本块,但我发现了一些问题:
VOID Routine(RTN rtn, VOID *v)
{
RTN_Open(rtn)
for (BBL bbl = RTN_BblHead(rtn); BBL_Valid(bbl); bbl = BBL_Next(bbl))
{ /* some code */ }
RTN_Close(rtn);
}
错误:不推荐使用的声明,
我该如何解决该错误,或者通过其他方式来解决?
您有一个 deprecated-declarations 警告,因为RTN_BblHead
现在已弃用。改为使用RTN_InsHead
。
来自include\pin\gen\image.ph
:
/* DO NOT EDIT */
/* RTN_BblHead is now deprecated. See RTN_InsHead.
*/
extern PIN_DEPRECATED_API BBL RTN_BblHead(RTN x);
文档中也提到了这一点:RTN_BblHead
你也可以传递-Wno-deprecated-declarations
给 GCC 来抑制这个警告。
编辑
请记住,PIN 首先是一个 DBI(动态二进制检测)框架:它在检测已执行的代码流时非常好,而在需要分解未执行的代码时则不太好。
例程检测允许 Pintool 在首次加载包含的图像时检查和检测整个例程,但正如文档指出的那样:
Pintool 可以执行例程的指令。没有足够的信息将指令分解为 BBL。
Pin通过静态发现找到RTN的指令,因此Pin不能保证它会找到RTN中的所有指令,这对于BBL来说更加困难。我的猜测是,他们在某个时候尝试过(因此过去使用了 RTN_BblHead)来提供 BBL 的静态发现,但发现率太低(或太容易出错)而无法被认为是可接受的,因此该功能已被弃用。
简而言之,是的,您需要通过指令发现 RTN 指令(知道该引脚可能会错过一些指令,因为这是静态完成的)。如果例程在某个时间点执行,您只能发现例程的 BBL。