如何找出引入AVX标志的内容

How to find out what introduces AVX flag

本文关键字:标志 AVX 何找出      更新时间:2023-10-16

我有一个相当大的x64 c ++程序,它是用Visual Studio编译的。我们有两种编译方式 - 一种是使用sln解决方案文件(从IDE或通过msbuild(,另一种是通过VS命令提示符中的Makefile(然后在内部使用Visual Studio的cl.exe和link.exe(。

不知何故,我遇到了通过 Makefile 构建的二进制构建在启用/AVX 指令的情况下生成可执行文件的情况,我不希望这样,所以我想找出如何摆脱它。

我尝试在没有任何参数的情况下编译和链接它(尤其是没有/arch:AVX(。我希望我在 sln 和 Makefile 中编译和链接相同的源代码和库。

找出AVX来源的简单方法是什么?项目包括数十个 h/cpp 文件、大约 40 个自己的库、10 个 Windows 库。你会怎么做?

简单的方法是,找到一台没有AVX的旧PC,在调试器中运行您的应用程序,它将崩溃并出现无效的指令运行时错误,并将捕获到调试器。这样,您将立即找到编译到该指令中的代码。

另一种更难的方法是编写一个 C# 控制台应用,用于反汇编编译的 DLL 或 EXE,并搜索 AVX 指令。你需要Gee.External.Capstonenuget 包来反汇编,PeNet包来分析部分。还有这个代码要反汇编。disassembleStreamEx方法将返回指令流。搜索 X86Instruction Group.AVX 或 X86Instruction Group.AVX2 指令,打印地址,然后使用 WinDBG + PDB 文件将地址转换为源代码位置。

更新:在此之前,请在代码库中搜索包含_mm256_*.asm的文件。如果你幸运的话,你不必做任何其他事情。