GCC: Как собрать файл в одну команду? - PullRequest
0 голосов
/ 02 октября 2019

Легко скомпилировать исходный код C в исполняемый файл: gcc hello.c -o hello. Напротив, вот как я сейчас превращаю программу сборки в исполняемый файл:

cpp -P hello.S > hello.s  # Run preprocessor.
as hello.s -o hello.o  # Assemble.
ld hello.o -o hello  # Link.

Есть ли способ сделать все это с помощью одной команды?

Операционная система - Debian 10.1Бастер, работающий на машине с 32-разрядным MIPS-прямым порядком байтов.

Для справки это hello.S, программа сборки MIPS, которая требует использования препроцессора C:

#include <regdef.h>
#include <sys/syscall.h>

.data
    mymsg: .asciiz "Hello\n"

.text
    .global __start

__start:
    li a0, 1
    la a1, mymsg
    li a2, 6
    li v0, SYS_write
    syscall
    li a0, 1
    li v0, SYS_exit
    syscall

Ответы [ 2 ]

1 голос
/ 02 октября 2019

gcc -static -nostdlib hello.S запускает его через CPP, затем собирает его и связывает просто с .o, без файлов запуска CRT и без библиотек, даже libgcc.a.

-nostdlib похож на -nostartfiles, но не включает библиотеки и код запуска CRT. Если я правильно понимаю документы, -nostdlib является комбинацией -nodefaultlibs -nostartfiles. https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

Современные дистрибутивы Linux обычно настраивают gcc по умолчанию -pie -fPIE. Использование -static отключает это (потому что PIE - это хак, который использует ELF «общий объект» в качестве исполняемого файла). ( 32-разрядные абсолютные адреса больше не разрешены в x86-64 Linux? ). Оставить -fPIE включенным не имеет значения, если нет входов .c или .cpp, только ассемблер;это опция кода поколения.

0 голосов
/ 02 октября 2019

С общая часть опций из документация GCC :

file.Sfile.sx

Код ассемблера, который необходимо предварительно обработать.

Таким образом, поддержка предварительной обработки, сборки и компоновки такого исходного файла уже поддерживается.

...