есть ли применение для флага G CC -S с g cc - c - PullRequest
0 голосов
/ 27 февраля 2020

Интересно, есть ли какая-либо польза от использования опции -S G CC в моих файлах Makefile.

Я уже довольно давно собираю C файлы, подобные следующим:

gcc -c a.c -o a.o
gcc -c b.c -o b.o
---
gcc a.o b.o -o a.out

Теперь будет лучше:

gcc -S a.c -o a.s
gcc -S b.c -o b.s
---
gcc -c a.s -o a.o
gcc -c b.s -o b.o
---
gcc a.o b.o -o a.out

Также есть возможность пропустить фазу .o, собирая файлы .s напрямую в двоичный файл. Какой вариант вы считаете лучшим и почему?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

-S flags просит g cc создать понятный человеку ассемблерный код - .o файлы хороши для компоновщика, но довольно крипти c для большинства людей ...

В основном используется когда вам нужна низкоуровневая оптимизация (короткого) фрагмента кода, который был определен профилированием как узкое место. Вы можете сравнить, как компилятор будет переводить различные версии, и выбрать ту, которая даст наиболее эффективный машинный код для этой конкретной c реализации .

Он не предназначен для использования в стандартные makefiles.

0 голосов
/ 27 февраля 2020

Также существует возможность пропустить фазу .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 ++ на сборку. И в этом случае было бы неплохо не загромождать сборку отладочной информацией.

...