Также существует возможность пропустить фазу .o
, собирая непосредственно .s
файлы в двоичный файл.
Простая сборка никогда не преобразуется непосредственно в исполняемый двоичный код, всегда есть промежуточный шаг объектного файла.
gcc a.s b.s -o ab.exe
всегда будет вызывать ассемблер (дважды), который генерирует объектный код для любых модулей, а затем объекты связываются. Добавьте -v
в командную строку, чтобы увидеть, какие подкоманды выполняются gcc
. gcc
на самом деле не компилятор, это просто программа драйвера, вызывающая задания в зависимости от параметров и расширений файлов. Правильный компилятор: cc1
(для C кода), cc1plus
(для кода C ++) и т. Д. c.
Какой вариант вы считаете лучшим и почему?
-S
имеет преимущество в создании кода сборки, однако компилятор будет всегда генерировать код сборки в качестве промежуточного шага. Это просто тот случай, когда он записывается во временные файлы, с двумя заметными исключениями:
-save-temps
: при этом не будут использоваться некоторые имена временных файлов (например, в /tmp
), но сохраняйте промежуточный код в том же месте, что и объекты (на самом деле есть два варианта: -save-temps=obj
и -save-temps=src
).
-pipe
: для передачи будут использоваться каналы код из одной программы поддержки в другую вместо файлов (кроме -save-temps
, который обнуляет -pipe
).
Таким образом, если вы хотите увидеть сгенерированную сборку, -save-temps
может быть путь к go. Однако эта опция также применяется к предварительно обработанному коду, который сохраняется в .i
для C, .ii
для C ++ и .s
для сборки. Это часто очень ценится при работе с C макросами.
В случае, если вы собираетесь проверять сгенерированную компилятором сборку, вам может понравиться -fverbose-asm
, который добавляет комментарии asm, которые указывают на связанный источник C / C ++ на сборку. И в этом случае было бы неплохо не загромождать сборку отладочной информацией.