В Linux /proc/cpuinfo
позволяет просто проверить все флаги процессора, которые есть у машины.
Обычно, если программе требуется расширенный набор инструкций машины, самый простой способ определить это - запустить ее и посмотреть, вызывает ли она SIGILLсигнал.
Но в моем случае все мои процессоры поддерживают как минимум SSE4.1 и AVX.
Итак, есть ли простой способ проверить, есть ли внутри двоичного файла специальные инструкции?
objdump --disassemble
выполняет разборку. Вы можете использоватьobjdump
для создания списка мнемоники. Он является частью Binutils, поэтому доступен в системах GNU Linux. Кроме того, дополнительные инструкции могут присутствовать, но могут не выполняться. У программы могли быть охранники времени выполнения.-mavx
чтобы компилятор выбирал только из AVX ISA, но есть способы обойти это. Например, встроенный ассемблер обычно может обойти проверки ISA компилятора.Ответы:
Я выбил программу на Rust, которая пытается это сделать. Я думаю, что это работает, хотя это недокументировано и ужасно хрупко:
https://github.com/pkgw/elfx86exts
Пример использования:
источник
Я столкнулся с той же проблемой, когда пытался понять процессы оптимизации GCC и выяснить, какие инструкции использовались или не использовались во время этого процесса. Поскольку я не дружу с огромным количеством кодов операций, я искал способ визуализации конкретных (скажем, SSE3) инструкций в разобранном коде или, по крайней мере, для вывода некоторой минимальной статистики, например, есть ли и сколько этих инструкций есть. в двоичном
Я не нашел никакого существующего решения, но ответ Джонатана Бен-Авраама оказался очень полезным, поскольку он указывает на отличный (и даже частично структурированный) источник кодов операций. Основываясь на этих данных, я написал сценарий Bash, который может визуализировать определенные наборы команд или распечатывать статистику о них, используя
grep
при выводе изobjdump
.Список кодов операций был преобразован в автономный скрипт Bash, который затем включается (с целью лучшей читаемости) в основной файл, который я назвал просто
opcode
. Так как коды операций вgas.vim
( определения синтаксиса Ширкаvim
, из ответа Джонатана) систематически (на первый взгляд) группировались в соответствии с различными архитектурами ЦП, я попытался сохранить это разделение и сделать отображение набора архитектур-> инструкций ; Сейчас я не уверен, что это хорошая идея. Отображение не является точным, и мне даже пришлось внести некоторые изменения в оригиналеgas.vim
группировка. Поскольку связанные с архитектурой наборы инструкций не были моей первоначальной целью, я пытался создавать только наборы инструкций основных архитектур, описанных в Интернете, но не обращаясь к документации производителей. Архитектура AMD мне не кажется надежной (за исключением наборов инструкций, таких как 3DNow! И SSE5). Тем не менее, я решил оставить здесь код для наборов команд различных архитектур, чтобы кто-то еще мог его изучить, исправить / улучшить и дать другим некоторые предварительные результаты.Начало основного файла с именем
opcode
:Пример
Opcode_list
файла, созданного и измененного с использованием инструкций поopcode
состоянию на 27 октября 2014 г., можно найти по адресу http://pastebin.com/yx4rCxqs . Вы можете вставить этот файл прямо наopcode
местоsource Opcode_list
строки. Я выпустил этот код, потому что Stack Exchange не позволил бы мне отправить такой большой ответ.Наконец, остальная часть
opcode
файла с реальной логикой:Имейте в виду, что если ваш поисковый запрос слишком велик (например, с набором команд Haswell и
-r
переключателем - это включает в себя сотни инструкций), вычисления могут продолжаться медленно и занимать много времени на больших входных данных, для которых этот простой сценарий не был предназначен ,За подробной информацией по использованию обращайтесь
Весь
opcode
сценарий (с включенным Opcode_list) можно найти по адресу http://pastebin.com/A8bAuHAP .Не стесняйтесь улучшать инструмент и исправлять любые ошибки, которые я мог сделать. Наконец, я хотел бы поблагодарить Джонатана Бен-Авраама за его прекрасную идею использования
gas.vim
файла Ширка .РЕДАКТИРОВАТЬ: теперь скрипт может найти, к какому набору инструкций относится код операции (можно использовать регулярное выражение).
источник
Сначала декомпилируйте ваш бинарный файл:
Затем найдите все инструкции SSE4 в файле сборки:
(Примечание: CRC32 может совпадать с комментариями.)
Найдите наиболее распространенные инструкции AVX (включая скалярные, включая AVX2, семейство AVX-512 и некоторые подобные FMA
vfmadd132pd
):ПРИМЕЧАНИЕ: проверено с
gawk
иnawk
.источник
К сожалению, на сегодняшний день не существует какой-либо известной утилиты, которая бы определяла требуемый набор инструкций из данного исполняемого файла.
Лучшее, что я могу предложить для x86, - это использовать
objdump -d
в двоичном файле ELF разбор исполняемых разделов на язык Gnu Assemply (gas
). Затем используйте определения синтаксиса Ширка,vim
чтобы либоgrep
просмотреть файл кода ассемблера, либо визуально отсканировать код ассемблера на наличие каких-gasOpcode_SSE41
либоgasOpcode_SANDYBRIDGE_AVX
инструкций или инструкций, которые вы видите вgas.vim
файле Ширка .Файл языка ассемблера содержит инструкции машинного уровня («коды операций»), которые компилятор сгенерировал при компиляции программы. Если программа была скомпилирована с флагами времени компиляции для инструкций SSE или AVX, и компилятор выпустил какие-либо инструкции SSE или AVX, то вы должны увидеть один или несколько кодов операций SSE или AVX в списке разборки, созданном
objdump -d
.Например, если вы делаете
grep vroundsdb
в файле кода сборки и находите совпадение, то вы знаете, что для выполнения двоичного файла требуются возможности AVX.Как видно из
gas.vim
файла Ширка, для x86 существует довольно много специфических для суб-архитектуры инструкций. Поэтому,grep
по общему признанию , пинг для всех кодов операций для каждой суб-архитектуры будет утомительным. Написание программ на C, Perl или Python для этого может быть отличной идеей для проекта с открытым исходным кодом, особенно если вы найдете кого-то, кто расширит его для ARM, PPC и других архитектур.источник
gas.vim
. OTOH, если это проблема с одним выстрелом, то вы можете легко узнать шаблоны кодов операций, которые различают суб-архитектуры.Я дал написание некоторого сценария Python для утилит, основанного на ответах Джонатана Бен-Авраамса и Киселейсюречека. Это грубый сценарий, но он выполняет свою работу.
https://gist.github.com/SleepProgger/d4f5e0a0ea2b9456e6c7ecf256629396 Он автоматически загружает и преобразует файл gas.vim и поддерживает вывод всех используемых (необязательных, не базовых) операций, включая набор функций, из которых они получены. Дополнительно он поддерживает поиск набора функций.
источник