as -o foo.o foo.s
Если у вас есть .S
, обычно это означает, что вы хотите пропустить его через препроцессор C перед сборкой. Интерфейсы gcc
и clang
сделают это за вас: gcc -c foo.S
(имя выходного файла по умолчанию foo.o вместо a.out). Однако, если ваш .S
на самом деле не имеет каких-либо директив CPP, таких как #if
или #define
, вы можете просто собрать его с помощью as
.
a.out
— это имя по умолчанию для вывода as
, но это это объектный файл, который вы получите от gcc -c foo.s
, а не связанный исполняемый файл! GNU Binutils as
не создает связанные исполняемые файлы.
(Имя выходного файла по умолчанию для ld foo.o
или gcc
/ clang
без -c
— также a.out, но пусть вас не смущает это имя.)
Вы можете использовать gcc -v -c foo.s
, чтобы показать используемую командную строку as
, включая параметр -o
. (у clang есть встроенный ассемблер, поэтому он не будет запускать отдельную команду as
, но интерфейс gcc
действительно просто запускает as
для сборки исходных файлов asm. А без -c
затем запускает ld
(через collect2) для связывания объектный файл в исполняемый файл.)
например в моей системе x86-64 GNU/Linux:
$ cat > foo.s
mov $231, %eax # __NR_exit_group
syscall
$ as foo.s
$ file a.out
a.out: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ ld a.out -o exit
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000
$ ls -l exit a.out
-rw-r--r-- 1 peter peter 664 Mar 22 08:23 a.out
-rwxr-xr-x 1 peter peter 4632 Mar 22 08:23 exit
$ file exit
exit: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
$ ./a.out
bash: ./a.out: Permission denied
$ ./exit
$ strace ./exit
execve("./exit", ["./exit"], 0x7ffc72823fc0 /* 55 vars */) = 0
exit_group(0) = ?
+++ exited with 0 +++
$ as --version
GNU assembler (GNU Binutils) 2.35.1
...
This assembler was configured for a target of `x86_64-pc-linux-gnu'.
$ ld --version
GNU ld (GNU Binutils) 2.35.1
...
person
Peter Cordes
schedule
22.03.2021
cc -c main.S
, чтобы получить такой объектный файл. Или используйтеclang
или любой другой компилятор вместоcc
. - person fuz   schedule 22.03.2021ld
, поэтому не похоже, что вы неправильно поняли этапы preproc/asm/COFF/linking в процессе сборки исполняемого файла ^^ - person Zilog80   schedule 22.03.2021