Может ли gcc компилировать сборку x86 или просто связать ее?

gcc может производить сборку, но как я могу скомпилировать чистую сборку с gcc или другим компилятором? Я знаю, что сборка x86 сложна, а другой набор команд, чем MIPS и Nios I, но теперь я хочу попытаться скомпилировать прямой x86 asm. Есть инструкции о том, как это сделать, но там есть C файл, и мне не нужен C файл для моей первой самой основной компиляции.

gcc -o test_asm asm_functions.S test_asm.c

Здесь шаг, создающий .o файлы

gcc -c asm_functions.S
gcc -c test_asm.c
gcc -o test_asm asm_functions.o test_asm.o

Но я не вижу того шага, на котором я могу напрямую компилировать x86 asm с gcc. Там другая программа с именем GNU as (GNU Assembler), может ли она использоваться для перевода сборки x86 на машинный код?

Test

Код (32.s)

.globl  _start

.text
_start:
        movl    $len, %edx
        movl    $msg, %ecx
        movl    $1, %ebx
        movl    $4, %eax
        int     $0x80

        movl    $0, %ebx
        movl    $1, %eax
        int     $0x80
.data
msg:
        .ascii  "Hello, world!\n"
        len =   . - msg

Шаги

$ gcc -c 32.s 
$ ls 32*
32.o  32.s
$ gcc -o 32 32.o 
32.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'

Итак, похоже, что у него могут быть смешанные 32 и 64 бита, должен ли я сказать, что компилятор имеет ли сборка 32 или 64-битные инструкции?

Update

Этот тест работал с gcc.

$ cat hello.s
.data
.globl hello
hello:
.string "Hi World\n"

.text
.global main
main:
    pushq   %rbp
    movq    %rsp,       %rbp
    movq    $hello,     %rdi
    call    puts
    movq    $0,         %rax
    leave
    ret
$ gcc hello.s -o hello
$ ./hello 
Hi World

Ответы

Ответ 1

Вы уже это делаете.

gcc -c asm_functions.S

Этот шаг создает объектный файл, asm_functions.o. Объектный файл является "связанным" (в отличие от "загружаемого" ) файла, который содержит машинный код, с некоторыми дополнительными инструкциями о том, как компоновщик должен изменить код при связывании. Сама программа gcc является всего лишь драйвером, она запускает as за кулисами для создания asm_functions.o. Таким образом, у вас есть возможность запускать as напрямую, но часто проще запустить интерфейс gcc.

Ответ 2

Хотя обновление работает, исходный код можно было скомпилировать, просто используя gcc -nostdlib. Например,

gcc -nostdlib 32.s -o 32 DarrylW