Каковы различия между компиляцией сборки с использованием gcc и as - PullRequest
1 голос
/ 03 июля 2019

Я изучаю, как использовать ассемблер (на Raspberry Pi, между прочим), и мне интересно, в чем разница между использованием gcc и as для компиляции.

Пока что я заметил следующие различия:

  • Я должен сделать дополнительный шаг связывания с as.
  • На Raspberry Pi as, кажется, распознает архитектуру лучше, чем gcc сама по себе. Я должен сказать gcc архитектуру, прежде чем я смогу использовать такие инструкции, как целочисленное деление.
  • С gcc У меня есть легкий доступ к функциям стандартной библиотеки языка C. Я предполагаю, что это возможно, используя as, но я еще не понял этого.

Я бы хотел придерживаться определенного компилятора. Какие еще различия я должен знать. Есть ли преимущество / недостаток использования любого из них?

Ответы [ 2 ]

7 голосов
/ 03 июля 2019

gcc - это просто внешний интерфейс, который запускает asld, если вы не используете -c, чтобы останавливаться на объектных файлах без ссылок). Используйте gcc -v, чтобы увидеть, что он запускает и какие параметры командной строки он передает.

Если вы хотите связать с библиотеками, обычно используйте gcc. Он знает правильные параметры командной строки для передачи в ld для установки путей к библиотекам и порядок их размещения в командной строке ld.

Вы можете найти gcc -nostdlib или -nostartfiles полезными, например, если вы хотите написать свои _start, но по-прежнему ссылаться на библиотеки. Также -no-pie и / или -static в зависимости от того, как вы хотите связать.


Если вам интересно узнать больше о цепочке инструментов и связывании, то поиграйтесь с опциями ld и посмотрите, что ломается, когда вы меняете опции. И / или используйте readelf -a для проверки получившегося исполняемого файла.

1 голос
/ 03 июля 2019

Вы также можете получить доступ к функциям стандартной библиотеки C в сборке. Просто следуйте соглашению о вызовах GCC и используйте стандартный printf вызов . Вы должны сначала скомпилировать вашу программу сборки с помощью as, чтобы создать объектный файл. После этого вы можете использовать компоновщик для связывания всех необходимых библиотек (например, stdio).

...