Мне было интересно, как использовать GCC в исходном файле C для вывода мнемонической версии машинного кода, чтобы я мог видеть, во что компилируется мой код. Вы можете сделать это с Java, но я не смог найти способ с GCC.
Я пытаюсь переписать метод C на ассемблере и посмотреть, как это делает GCC, было бы очень полезно.
Ответы:
Если вы компилируете с символами отладки, вы можете использовать
objdump
для создания более читаемой разборки.objdump -drwC -Mintel
это мило:-r
показывает имена символов при перемещениях (так вы увидитеputs
вcall
инструкции ниже)-R
показывает динамическое связывание перемещений / имен символов (полезно для разделяемых библиотек)-C
раскладывает имена символов C ++-w
это "широкий" режим: он не переносит строки машинного кода-Mintel
: используйте GAS / binutils MASM-подобный.intel_syntax noprefix
синтаксис вместо AT & T-S
: чередовать исходные строки с разборкой.Вы могли бы положить что-то вроде
alias disas="objdump -drwCS -Mintel"
в вашем~/.bashrc
Пример:
источник
-Wa,-adhln -g to gcc
. Это предполагает, что ассемблер - газ, и это не всегда так.-Mintel
.Если вы дадите GCC флаг
-fverbose-asm
, он будетисточник
objdump
-objdump -drwCS -Mintel
так как я могу использовать что-то вродеverbose
сobjdump
? Так что я могу иметь комментарии в коде asm, как-fverbose-asm
в gcc?-fverbose-asm
Добавляется дополнительный материал в виде комментариев в синтаксисе asm вывода, а не директив, которые добавят в.o
файл что-то дополнительное . Это все отбрасывается во время сборки. Посмотрите на вывод asm компилятора вместо дизассемблирования, например, на godbolt.org, где вы можете легко сопоставить его с линией исходного текста с помощью наведения мыши и цветовой подсветки соответствующих строк исходного / асм. Как убрать "шум" из вывода сборки GCC / clang?Разорвано прямо с http://www.delorie.com/djgpp/v2faq/faq8_20.html (но удаление ошибочное
-c
)источник
gcc -march=native -O3 -save-temps
. Вы все еще можете использовать,-c
чтобы остановиться на создании объектного файла, не пытаясь связать или что-то еще.-save-temps
Интересно, так как он выдает за один раз точный код, сгенерированный кодом, тогда как другой вариант вызова компилятора-S
означает компиляцию дважды, и, возможно, с другими параметрами. Но-save-temps
сбрасывает все в текущем каталоге, что немного грязно. Похоже, он больше предназначен для отладки GCC, а не для проверки вашего кода.Использование
-S
переключателя на GCC в системах на базе x86 по умолчанию создает дамп синтаксиса AT & T, который можно указать с помощью-masm=att
переключателя, например:Принимая во внимание, что если вы хотите создать дамп в синтаксисе Intel, вы можете использовать
-masm=intel
переключатель следующим образом:(Оба производят дампы
code.c
в их различный синтаксис, в файлcode.s
соответственно)Чтобы создать аналогичные эффекты с помощью objdump, вы должны использовать пример с параметром
--disassembler-options=
intel
/att
switch (с дампами кода для иллюстрации различий в синтаксисе):и
источник
gcc -S -masm=intel test.c
точно не работа для меня, я получил некоторую помесь Intel и AT & T синтаксис , как это:mov %rax, QWORD PTR -24[%rbp]
вместо этого:movq -24(%rbp), %rax
..o
файлов ASM и файлов, т. Е. Через-Wa,-ahls -o yourfile.o yourfile.cpp>yourfile.asm
-M
опцию, она такая же,--disassembler-options
но намного короче, например,objdump -d -M intel a.out | less -N
godbolt - очень полезный инструмент, в их списке есть только компиляторы C ++, но вы можете использовать
-x c
флаг, чтобы заставить его обрабатывать код как C. Затем он сгенерирует листинг сборки для вашего кода рядом, и вы можете использоватьColourise
опцию для генерации цветные полосы, чтобы визуально указать, какой исходный код отображается на сгенерированную сборку. Например, следующий код:используя следующую командную строку:
и
Colourise
будет генерировать следующее:источник
-masm=intel
а как на счет остальных?-x c
Вы пробовали
gcc -S -fverbose-asm -O source.c
тогда посмотреть в сгенерированныйsource.s
файл ассемблера?Сгенерированный ассемблерный код входит в
source.s
(вы можете переопределить это с помощью имени-o
ассемблера );-fverbose-asm
опция задает компилятор испускать некоторые ассемблерные комментарии «объясняющие» сгенерированный код на ассемблере.-O
Опция задает компилятор для оптимизации немного (это может оптимизировать больше с-O2
или-O3
).Если вы хотите понять, что
gcc
происходит, попробуйте передать,-fdump-tree-all
но будьте осторожны: вы получите сотни файлов дампа.Кстати, GCC расширяется через плагины или с помощью MELT (высокоуровневый язык, специфичный для домена, для расширения GCC; от которого я отказался в 2017 году)
источник
source.s
, так как много людей ожидали бы распечатку на консоли.-S -o-
на стандартный вывод.-masm=intel
полезно, если вы хотите использовать синтаксис NASM / YASM. (но он используетqword ptr [mem]
, а не простоqword
, так что это больше похоже на Intel / MASM, чем NASM / YASM). gcc.godbolt.org отлично справляется с уборкой дампа: опционально убирает строки только для комментариев, неиспользуемые метки и директивы ассемблера.-Og
это даже лучше, чем-O1
. Это означает «оптимизировать для отладки» и создает asm без слишком многих хитрых / трудных для выполнения оптимизаций, которые делают все, что говорит источник. Он был доступен с gcc4.8, но в clang 3.7 его до сих пор нет. ИДК, если они решили против этого или что.Вы можете использовать GDB для этого, как objdump.
Этот отрывок взят из http://sources.redhat.com/gdb/current/onlinedocs/gdb_9.html#SEC64
Вот пример, показывающий смешанный источник + сборка для Intel x86:
источник
set disassembly-flavor intel
команду.Используйте ключ -S (примечание: заглавная S) для GCC, и он будет передавать код сборки в файл с расширением .s. Например, следующая команда:
gcc -O2 -S -c foo.c
источник
Я не дал выстрел в GCC, но в случае G ++. Команда ниже работает для меня. -g для отладочной сборки и -Wa, -adhln передается ассемблеру для перечисления с исходным кодом
g ++ -g -Wa, -adhln src.cpp
источник
используйте -Wa, -adhln в качестве опции на gcc или g ++ для вывода вывода списка на стандартный вывод.
-Wa, ... для параметров командной строки для ассемблера (выполняется в gcc / g ++ после компиляции C / ++). Он вызывается как внутренне (as.exe в Windows). Видеть
> как --help
в командной строке, чтобы увидеть больше помощи для инструмента ассемблера внутри gcc
источник