Intel Pin with C ++ 14

时间:2016-09-25 19:42:35

标签: c++ c++11 gcc c++14 intel-pin

问题

关于英特尔Pin与C ++ 14或其他C ++版本的使用,我有几个问题。

  • 使用较新版本从较旧的C ++编译代码时几乎没有任何问题,但由于Intel Pin操作指令级别,如果我使用C ++ 11或C ++ 14编译它,是否会产生任何不良副作用?
  • 如果可以使用C ++ 11或C ++ 14进行编译,如何制定规则以仅为我的工具启用更新版本的C ++?
  • 如何将GCC / G ++默认C ++版本设置为最新版本,如果可能,以及在执行此操作时应该记住哪些内容?

场合

我正在构建动态调用图引脚工具。为了使其易于理解,我计算了调用堆栈的深度。为了安全起见,我决定用std::mutex包装增加或减少深度的代码摘录。这让我遇到了std::mutex仅在C ++ 11之后可用的问题,这在我的机器中不是Intel Pin默认值。

$ g++ -v
[...]
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2)

编译命令:

$ make obj-intel64/callgraph.so
[...]
error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support
[...]

修改

我设法制定了一个构建规则,将版本定义为C ++ 11,但它打破了。通过make发送到g ++的命令是

g++ -DBIGARRAY_MULTIPLIER=1 -Wall -Werror -Wno-unknown-pragmas -D__PIN__=1
-DPIN_CRT=1 -fno-stack-protector -fno-exceptions -funwind-tables
-fasynchronous-unwind-tables -fno-rtti -DTARGET_IA32E -DHOST_IA32E -fPIC
-DTARGET_LINUX -fabi-version=2  -I/home/gabriel/Downloads/pin-3.0-76991-gcc-linux/source/include/pin
-I/home/gabriel/Downloads/pin-3.0-76991-gcc-linux/source/include/pin/gen
-isystem /home/gabriel/Downloads/pin-3.0-76991-gcc-linux/extras/stlport/include
-isystem /home/gabriel/Downloads/pin-3.0-76991-gcc-linux/extras/libstdc++/include
-isystem /home/gabriel/Downloads/pin-3.0-76991-gcc-linux/extras/crt/include
-isystem /home/gabriel/Downloads/pin-3.0-76991-gcc-linux/extras/crt/include/arch-x86_64
-isystem /home/gabriel/Downloads/pin-3.0-76991-gcc-linux/extras/crt/include/kernel/uapi
-isystem /home/gabriel/Downloads/pin-3.0-76991-gcc-linux/extras/crt/include/kernel/uapi/asm-x86
-I/home/gabriel/Downloads/pin-3.0-76991-gcc-linux/extras/components/include
-I/home/gabriel/Downloads/pin-3.0-76991-gcc-linux/extras/xed-intel64/include
-I/home/gabriel/Downloads/pin-3.0-76991-gcc-linux/source/tools/InstLib -O3
-fomit-frame-pointer -fno-strict-aliasing  -std=c++11 
-c -o obj-intel64/callgraph.o callgraph.cpp

这不会编译。相反,它会陷入STL标头内的巨大错误日志中。看来Pin附带了它自己的STL子集,与C ++ 11和C ++ 14冲突。我上传了paste g ++输出。它填充了2331行,但我注意到它访问的文件夹中有奇怪的东西。 STL库包含在 2 不同目录中:

  • /usr/include/c++/5/
  • /home/gabriel/Downloads/pin-3.0-76991-gcc-linux/extras/stlport/include/

一个一个地解决错误是不可行的,删除pin stl端口可能是一个更糟糕的想法。如果可以将Pin与较新的C ++一起使用,我说简单的std=c++1y就不行了。

1 个答案:

答案 0 :(得分:3)

从用于编译pin工具的编译器选项中,我假设您使用的是最新版本的Pin,即3.0。根据{{​​3}},框架附带的CRT不支持C ++ 11及更高版本的语言。特别是,您将无法使用C ++ 11中支持的任何API,包括std::mutex。如果您使用C ++ 11 API至关重要,那么您应该使用以前版本的Pin,即2.14,它不附带CRT并使用编译器的CRT。

但是,如果您只想要一个互斥锁,则可以使用Pin 3.0附带的OS便携式互斥锁。有关更多信息,请参阅Intel

使用Pin 3.0时,不允许使用编译器的任何头文件或目标文件(来自/usr/include/c++/5/的文件或目标文件)。您只能使用PinCRT和少量系统头文件。