我有最新版本的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(例如BNDLDXBNDMK)计算特定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/

10-11 15:41