我拥有最新版本的Intel Pin 3.0版本76887.
我有一个支持MPX的玩具示例:
#include <stdio.h>
int g[10];
int main(int argc, char **argv) {
int x = g[11];
printf("%d\n", x);
return 0;
}
使用gcc + MPX编译时,我通过objdump
在反汇编中看到MPX指令,该示例正确地写了一个边界违规:
Saw a #BR! status 0 at 0x401798
现在,我想计算使用英特尔Pin的特定MPX指令的总数,例如BNDLDX
和BNDMK
。
我的第一次尝试是使用随附的工具source/tools/SimpleExamples/trace.cpp
。此工具在MPX指令的位置显示NOPs
。
在我的第二次尝试中,我使用以下代码段编写了自己的工具:
xed_iclass_enum_t iclass = (xed_iclass_enum_t)INS_Opcode(ins);
if (iclass == XED_ICLASS_BNDMK)
INS_InsertPredicatedCall(ins, IPOINT_BEFORE, (AFUNPTR)countBndmk, IARG_END);
这不起作用,countBndmk永远不会被调用。我用其他指令iclasses仔细检查了我的代码,他们工作了。显然,Pin(或XED?)无法识别MPX指令存在问题。
浏览文档时,我注意到一个有趣的旋钮
KNOB<BOOL> knob_mpx_mode(KNOB_MODE_WRITEONCE,"supported:xed","xed_mpx_mode","0","Enable Intel(R) MPX instruction decoding")
此旋钮似乎启用了MPX解码,默认情况下为0
,我不知道如何通过命令行或我的工具启用它。我发现在代码或互联网上没有其他对此问题的引用。
我知道我可以使用Intel SDE转储包括MPX指令的调试跟踪。我想知道是否有办法在Intel Pin中启用MPX。或者唯一的解决方案是自己解码操作码?
答案 0 :(得分:0)
回答可能有点迟,但似乎你只需将选项传递给PIN。
一点背景知识:
在英特尔手册中有这一行(与MPX无关,但它提供了线索):
Add the knob support_jit_api to the Pin command line as Pin tool option:
<Pin executable> <pin options> -t <Pin tool> -support_jit_api <Other Pin tool options> -- <Test application> <Test application options>
此选项发生there's an existing KNOB:
KNOB<BOOL> LEVEL_PINCLIENT::KnobJitApi ( KNOB_MODE_WRITEONCE ,
"pintool:sym" ,
"support_jit_api" ,
"0" ,
"Enables the Jitted Functions Support"
)
由于MPX旋钮定义为:
KNOB<BOOL> knob_mpx_mode(KNOB_MODE_WRITEONCE,"supported:xed","xed_mpx_mode","0","Enable Intel(R) MPX instruction decoding")
我猜您只需要将选项传递给PIN:
<Pin executable> <pin options> -t <Pin tool> -xed_mpx_mode <Other Pin tool options> -- <Test application> <Test application options>
似乎这些KNOB硬编码到PIN / PinTools上。