Инструкция по сборке вывода GCC Arm64

У меня есть программа 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?

Вам нужен кросс-компилятор. wiki.osdev.org/GCC_Cross-Compiler

Eugene Sh. 28.05.2024 22:15

Нужен ли мне кросс-компилятор, если он работает в системе ARM64 и нормально компилирует работающие программы? Если понадобится, я могу загрузить кросс-компилятор, это показалось странным, поскольку он уже работает в системе, являющейся целью кросс-компиляции.

DavidT 28.05.2024 22:43

если и хост, и цель представляют собой одну и ту же арку, то нет, кросс-компилятор не нужен.

Eugene Sh. 28.05.2024 22:54

Нет, вы строите машину на машине Arm64, поэтому сборка — Arm64. Назначение слева и аргументы источника справа.

Craig Estey 28.05.2024 22:55

Различие в синтаксисе AT&T применимо только к x86 (и, возможно, к некоторым другим?), но не к ARM. gcc выводит тот же стандартный синтаксис сборки, указанный компанией ARM.

Nate Eldredge 29.05.2024 17:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот вывод на самом деле представляет собой ассемблерный код 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 не будь так строг к себе. Ассемблер, сгенерированный компилятором, содержит много дополнительных вещей. Вы просто «должны знать» это. Теперь да... У каждого бывает «первый раз».

Craig Estey 29.05.2024 03:32
Как убрать «шум» из вывода сборки GCC/clang? . Или просто используйте godbolt.org и позвольте ему обо всем позаботиться.
phuclv 29.05.2024 18:54

Другие вопросы по теме