我有一个很大的x64 c ++程序,它是用Visual Studio编译的。我们有两种编译方法-一种是sln解决方案文件(从IDE或通过msbuild),另一种是通过VS命令提示符下的Makefile(然后在内部使用Visual Studio的cl.exe和link.exe)。>
某种程度上,我遇到了这样的情况,即通过 Makefile生成的二进制文件会生成启用了/ AVX指令的可执行文件,而我不希望这样做,因此我想了解如何摆脱它。 / p>
我尝试不带任何参数(尤其是不带/ arch:AVX)进行编译和链接。我希望我可以在sln和Makefile中编译并链接相同的源和库。
如何简单找出AVX的来源?项目包括数十个h / cpp文件,大约40个自己的库,10个Windows库。您将如何进行?
答案 0 :(得分:1)
简单的方法是,找到一台没有AVX的旧PC,在调试器中运行您的应用,它将因无效的指令运行时错误而崩溃,并会捕获到调试器中。这样,您将立即找出该指令中编译了哪些代码。
另一种更困难的方法是,编写一个C#控制台应用程序,该应用程序将反汇编已编译的DLL或EXE,然后搜索AVX指令。您需要Gee.External.Capstone
的nuget软件包才能进行拆卸,需要PeNet
的软件包才能将其解析为各个部分。 Also this code to disassemble。 disassembleStreamEx
方法将向您返回指令流。搜索X86InstructionGroup.AVX或X86InstructionGroup.AVX2指令,打印地址,然后使用例如WinDBG + PDB文件将地址转换为源代码位置。
更新:在执行此操作之前,请在代码库中搜索包含_mm256_
和*.asm
文件的文件。如果幸运的话,您无需执行其他任何操作。