Есть ли способ извлечь asm из функции? (VS2010, gcc) - PullRequest
2 голосов
/ 15 июля 2011

Я бы хотел иметь возможность сравнить asm, сгенерированный Visual Studio и GCC для конкретной функции.В качестве аргумента давайте предположим, что мы уже знаем, что эта функция существует в обоих двоичных файлах.

Что я хотел бы сделать, это просто запустить скрипт, который извлечет требуемую функцию в разобранном виде (asm) из обоих двоичных файлов.Я знаю, как проверить asm в Visual Studio и gdb соответственно, но я немного озадачен тем, как сделать это любым способом, пригодным для написания сценариев.

Любые идеи или теории могут помочь.Спасибо!

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Оба компилятора поддерживают параметр командной строки, который заставляет его оставить созданный язык ассемблера в результате компиляции вместо объектного файла. С MSVC используйте /Fa[file] (и тоже генерирует .obj - протестировано с VS2008). При gcc опция командной строки -S оставляет выходные данные сборки.

Хотя использование этой опции может быть сделано в Visual Studio IDE, похоже, что при сравнении по сценарию для компиляции файлов будет использоваться командный файл или другой интерпретатор командной строки сценария, извлекать нужную часть с помощью sed или чего-либо еще, и затем сделайте все необходимое сравнение.

gcc -S x.c       (generates x.S)
cl  /Fa  x.c     (generates x.asm and x.obj)
0 голосов
/ 26 июля 2011

Большинство компиляторов могут генерировать выходные данные сборки. Синтаксис отличается, однако. У gcc сначала есть операнд-источник во всех инструкциях asm, а у большинства других компиляторов и ассемблеров операнд-адресат первый. Вместо этого вы можете разобрать объектный файл, если хотите получить одинаковый синтаксис для всех компиляторов, но вы потеряли некоторую информацию об именах переменных и т. Д. Я могу порекомендовать дизассемблер objconv .

...