У меня есть программа c на Raspberry Pi. Я пытаюсь получить сборку написанного мной кода. Поскольку Raspberry Pi — это процессор ARM64, я ожидал, что сборка будет на ARM64.
Команда: gcc -S main.c
Код:
#include <stdio.h>
int main() {
printf("Hello world!\n");
return 1;
}
Сборка:
.arch armv8-a
.file "main.c"
.text
.section .rodata
.align 3
.LC0:
.string "Hello world!"
.text
.align 2
.global main
.type main, %function
main:
.LFB0:
.cfi_startproc
stp x29, x30, [sp, -16]!
.cfi_def_cfa_offset 16
.cfi_offset 29, -16
.cfi_offset 30, -8
mov x29, sp
adrp x0, .LC0
add x0, x0, :lo12:.LC0
bl puts
mov w0, 1
ldp x29, x30, [sp], 16
.cfi_restore 30
.cfi_restore 29
.cfi_def_cfa_offset 0
ret
.cfi_endproc
.LFE0: .arch armv8-a
.file "first.c"
.text
.section .rodata
.align 3
.LC0:
.string "Hello world!"
.text
.align 2
.global main
.type main, %function
main:
.LFB0:
.cfi_startproc
stp x29, x30, [sp, -16]!
.cfi_def_cfa_offset 16
.cfi_offset 29, -16
.cfi_offset 30, -8
mov x29, sp
adrp x0, .LC0
add x0, x0, :lo12:.LC0
bl puts
mov w0, 1
ldp x29, x30, [sp], 16
.cfi_restore 30
.cfi_restore 29
.cfi_def_cfa_offset 0
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 12.2.0-14) 12.2.0"
.section .note.GNU-stack,"",@progbits
.size main, .-main
.ident "GCC: (Debian 12.2.0-14) 12.2.0"
.section .note.GNU-stack,"",@progbits
Это синтаксис AT&T (я думаю), и я хочу получить сборку ARM64. Я пробовал такие параметры, как -masm, но компилятор выдает ошибку, сообщая, что это нераспознанный параметр.
Как мне заставить GCC сгенерировать сборку ARM64?
Нужен ли мне кросс-компилятор, если он работает в системе ARM64 и нормально компилирует работающие программы? Если понадобится, я могу загрузить кросс-компилятор, это показалось странным, поскольку он уже работает в системе, являющейся целью кросс-компиляции.
если и хост, и цель представляют собой одну и ту же арку, то нет, кросс-компилятор не нужен.
Нет, вы строите машину на машине Arm64, поэтому сборка — Arm64. Назначение слева и аргументы источника справа.
Различие в синтаксисе AT&T применимо только к x86 (и, возможно, к некоторым другим?), но не к ARM. gcc выводит тот же стандартный синтаксис сборки, указанный компанией ARM.





Этот вывод на самом деле представляет собой ассемблерный код ARM64. В этом нет ничего плохого.
Компилятор генерирует множество директив (точечных команд), но на самом деле это не инструкции ассемблера.
Фактический ассемблерный код представляет собой эту отфильтрованную часть:
stp x29, x30, [sp, -16]!
mov x29, sp
adrp x0, .LC0
add x0, x0, :lo12:.LC0
bl puts
mov w0, 1
ldp x29, x30, [sp], 16
ret
@DavidT не будь так строг к себе. Ассемблер, сгенерированный компилятором, содержит много дополнительных вещей. Вы просто «должны знать» это. Теперь да... У каждого бывает «первый раз».
Вам нужен кросс-компилятор. wiki.osdev.org/GCC_Cross-Compiler