我有最新版本的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
现在,我想使用Intel Pin(例如
BNDLDX
和BNDMK
)计算特定MPX指令的总数。我的第一次尝试是使用附带的工具
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。我用其他指令iclass仔细检查了我的代码,它们起作用了。显然,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
,我不知道如何通过命令行或在我的工具中启用它。在代码或Internet中,我没有找到其他对此问题的引用。我知道我可以使用Intel SDE转储包括MPX指令的调试跟踪。我想知道是否有一种方法可以在Intel Pin中启用MPX。还是唯一的解决方案是自己解码操作码?
最佳答案
回答可能有点迟,但似乎您只需要将选项传递给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>
似乎这些旋钮已硬编码到PIN / PinTools上。
关于intel-pin - 英特尔Pin 3.0无法识别MPX指令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40047962/