卡洛斯的回答更像是一种解决方法,但它非常准确。让所有正确的旋钮都正确是一项疯狂的工作。更重要的是,第 3 版从操作系统可能拥有的任何本机运行时切换过来,并开始使用它们自己的运行时。
经过半天的颠倒示例后,我可以想出这个(我假设是 64 位 Windows 目标,但不难注意到什么是特定于体系结构的)
首先,您应该正确设置包含文件夹(但请确保首先设置PIN_ROOT)
$(PIN_ROOT)\source\include\pin;$(PIN_ROOT)\source\include\pin\gen;$(PIN_ROOT)\source\tools\InstLib;$(PIN_ROOT)\extras\xed-intel64\include\xed;$(PIN_ROOT)\extras\components\include;$(PIN_ROOT)\extras\stlport\include;$(PIN_ROOT)\extras;$(PIN_ROOT)\extras\libstdc++\include;$(PIN_ROOT)\extras\crt\include;$(PIN_ROOT)\extras\crt;$(PIN_ROOT)\extras\crt\include\arch-x86;$(PIN_ROOT)\extras\crt\include\kernel\uapi;$(PIN_ROOT)\extras\crt\include\kernel\uapi\asm-x86;
然后,在编译器中设置这些标志: /MT /GR- /GS- /EHs- /EHa- /fp:strict /Oi- /FIinclude/msvc_compat.h
而这些定义的预处理器:TARGET_IA32E;HOST_IA32E;TARGET_WINDOWS;WIN32;__PIN__=1;PIN_CRT=1;__LP64__
(拜托,真的要注意前两个.. IA32 Ë指的x86-64和他们的错误组合可能导致的符号和诸如此类的东西无数恶人的问题)。
请记住,除了像 3 个标题([xmm]intrin.h和有限的windows.h)之外,您不能使用 pintool 之外的任何其他标题。
接下来是链接器。你需要这些文件夹
$(PIN_ROOT)\intel64\lib;$(PIN_ROOT)\intel64\lib-ext;$(PIN_ROOT)\extras\xed-intel64\lib;$(PIN_ROOT)\intel64\runtime\pincrt;
和这些库,以绝对正确的顺序(/NODEFAULTLIB
推荐)
pin.lib;xed.lib;pinvm.lib;kernel32.lib;pincrt.lib;ntdll-64.lib;crtbeginS.obj
( stlport-static.lib
, m-static.lib
,c-static.lib
并且os-apis.lib
在更复杂的情况下也可能需要)
最后但并非最不重要的是,您应该添加/export:main /SAFESEH:NO /IGNORE:4210 /IGNORE:4049
到链接器命令行。对于其他任何事情,请查看PinCRT 白皮书,我无法推荐足够的阅读。