Как узнать, что представляет флаг AVX - PullRequest
0 голосов
/ 17 октября 2018

У меня довольно большая программа x64 c ++, скомпилированная с Visual Studio.Есть два способа, как его скомпилировать - один с помощью файла решения sln (из IDE или через msbuild), другой - через Makefile в командной строке VS (который затем внутренне использует cl.exe и link.exe Visual Studio).

Каким-то образом я попал в ситуацию, когда двоичная сборка через Makefile создает исполняемый файл с включенными инструкциями / AVX, и я не хочу этого , поэтому я хочу выяснить, как от него избавиться.

Я пытаюсь скомпилировать и связать его без каких-либо параметров (особенно без / arch: AVX).Я надеюсь, что я скомпилирую и свяжу одни и те же источники и библиотеки в sln и Makefile.

Какой самый простой способ узнать, откуда взялся AVX?Проект включает в себя десятки файлов h / cpp, около 40 собственных библиотек, 10 библиотек Windows.Как бы вы поступили?

1 Ответ

0 голосов
/ 17 октября 2018

Простой способ - найти старый ПК без AVX, запустить приложение в отладчике, оно вылетит с ошибкой во время выполнения недопустимой инструкции и переместится в отладчик.Таким образом, вы сразу узнаете, какой код скомпилирован в эту инструкцию.

Другой, более сложный способ - написать консольное приложение C #, которое разбирает скомпилированную DLL или EXE и ищет инструкцию AVX.Вам понадобится пакет Gee.External.Capstone nuget для разборки, пакет PeNet для разбора на разделы. Также этот код для разборки .Метод disassembleStreamEx вернет вам поток инструкций.Выполните поиск инструкций X86InstructionGroup.AVX или X86InstructionGroup.AVX2, распечатайте адреса, а затем используйте, например, файл WinDBG + PDB для преобразования адресов в местоположение исходного кода.

Обновление: перед этим выполните поиск в базе кодадля файлов, содержащих файлы _mm256_ и *.asm.Если вам повезет, вам больше ничего не придется делать.

...