我试图在特定例程中迭代基本块,但我发现了一些问题:
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);
}
错误:不推荐声明,
我如何修复该错误,或以其他方式执行此操作?
答案 0 :(得分:2)
您有一个弃用声明警告,因为现在不推荐使用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的静态发现,但是发现率太低(或太容易出错)被认为是可接受的,因此该功能被弃用了。 / p>
简而言之,是的,您需要通过指令发现RTN指令(知道引脚可能会错过某些指令,因为这是静态完成的)。如果例程在某个时刻执行,则只能发现例程的BBL。