Как я могу увидеть код сборки для С++-программы?

Как я могу увидеть код сборки для программы на С++?

Каковы популярные инструменты для этого?

Ответ 1

Запросить компилятор

Если вы сами создаете программу, вы можете попросить компилятор испустить источник сборки. Для большинства компиляторов UNIX используйте переключатель -S.

  • Если вы используете сборщик GNU, компиляция с -g -Wa,-alh даст смешанный источник и сборку на stdout (-Wa просит драйвер компилятора передать параметры ассемблеру, -al включает список сборок и -ah добавляет листинг источника высокого уровня):

    g++ -g -c -Wa,-alh foo.cc

  • Для Visual Studio используйте /FAsc.

Загляните в двоичный

Если вы скомпилировали двоичный файл,

  • используйте objdump -d a.out в UNIX (также работает для cygwin),
  • dumpbin /DISASM foo.exe в Windows.

Используйте свой отладчик

Отладчики также могут показаться disassebly.

Ответ 2

В GCC/g++ скомпилируйте с помощью -S. Это будет выводить файл something.s с кодом сборки.

Изменить: если вы хотите, чтобы выход находился в синтаксисе Intel (который является IMO, гораздо более читаемым и большинством руководств по сборке его используют), скомпилируйте с помощью -masm=intel.

Ответ 3

В Visual Studio;

  • установить точку останова
  • запустить программу, пока она не остановится в точке останова
  • rightcick на исходном коде и выберите "show dissasembly"

Ответ 4

Для gcc/g++

gcc -save-temps -fverbose-asm prog.c

Это создаст prog.s с некоторыми комментариями к переменным, используемым в каждой строке asm:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #

Ответ 5

Независимо от того, какой отладчик вы используете, должен иметь вид сборки (Visual Studio, Borland IDE, gdb и т.д.). Если вы не используете отладчик, и вы просто хотите увидеть, какая сборка находится в программе, вы можете использовать дизассемблер или, альтернативно, запустить программу и подключиться к ней с помощью отладчика и сделать там дамп. См. Ссылки на дизассемблеры для получения информации о параметрах.

Ответ 6

Многие люди уже говорили, как испускать код сборки с данным компилятором. Другим решением является компиляция объектного файла и сбрасывание его с помощью инструмента objdump, readelf (в Unix) или DUMPBIN (ссылка) (в Windows). Вы также можете сбрасывать исполняемый файл, но будет труднее прочитать результат.

Это имеет то преимущество, что вы работаете с любым компилятором.

Ответ 7

Как уже упоминалось, ваш отладчик платформы является хорошей отправной точкой. Для отбойного молотка всех отладчиков и дизассемблеров ознакомьтесь с IDA Pro.

На платформах Unix/Linux (включая Cygwin) вы можете использовать objdump --disassemble <executable>.

Ответ 8

Большинство компиляторов имеют возможность выводить список сборок. Например. с VisualStudio вы можете использовать что-то вроде:

cl.exe /FAfile.asm file.c

Для лучшей читаемости большинство отладчиков будут предлагать представление, которое чередует разборку с исходным исходным кодом, поэтому вы можете сравнить свой код с выходом компилятора по строкам.

Ответ 10

Вы также можете попробовать этот сайт: http://assembly.ynh.io/

Там вы можете вставить свой код C или С++ и нажать синюю кнопку, чтобы увидеть эквивалентную версию сборки.

Ответ 11

В Visual Studio вы можете сгенерировать список ассемблера для проекта С++.

Перейдите к свойствам проекта, затем к файлам С++/Output и установите для параметра Assembler Output и расположение списка ASM имя файла.

Ответ 12

Этот сайт в настоящее время работает для меня (2017): https://godbolt.org/

Ответ 13

В Intel Mac OS X 10.8 (Mountain Lion) директива -masm=intel не работала. Однако, если вы установили Xcode, он должен был установить инструмент с именем 'otool':

otool code.o -tV

Вы должны предоставить скомпилированный объектный код в качестве параметра.

Ответ 14

Если вы пользователь Eclipse, вы можете использовать Разборный вид.

В представлении "Разборка" отображается загруженная программа как ассемблер инструкции, смешанные с исходным кодом для сравнения. В настоящее время строка выполнения указана маркером стрелки и выделена в Посмотреть. В представлении "Разборка" вы можете выполнить следующие задачи:

  • Установить точки останова в начале любой инструкции ассемблера
  • Включить и отключить точки останова и установить их свойства
  • Выполняйте инструкции по разборке вашей программы.
  • Перейти к определенным инструкциям в программе