Как решить проблему связывания crt0.o при компиляции кросс?

Как добавить ctr0.o?

Я получаю эту ошибку:

yagarto-4.7.2/bin/arm-none-eabi-ld: cannot find crt0.o: No such file or directory
collect2: error: ld returned 1 exit status`

при компиляции очень простой программы из здесь:

/* -- first.s */
/* This is a comment */
.global main /* 'main' is our entry point and must be global */
.func main   /* 'main' is a function */

main:          /* This is main */
    mov r0, #2 /* Put a 2 inside the register r0 */
    bx lr      /* Return from main */

Я видел эти 2 потока и не получил никакого полного и прямого ответа:

У меня есть эти файлы, в чем разница между crt0 и crtn, я не могу использовать его?

./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crtn.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crtn.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crtn.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crtn.o

Решение SO дает обходное решение, которое также не работает:

arm-none-eabi-gcc -o first assembler_tutorial/chapter01/first.o -nostartfiles
./yagarto-4.7.2/bin/arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000

Ответ 1

vectors.s

.globl _start
_start:
    mov sp,#0x8000
    bl main
hang: b hang

main.s

.globl main
main:
    mov r0,#2
    bx lr

memmap (компоновщик script)

MEMORY
{
    ram : ORIGIN = 0x8000, LENGTH = 0x10000
}
SECTIONS
{
    .text : { *(.text*) } > ram
    .bss : { *(.bss*) } > ram
}

Команды

arm-none-eabi-as vectors.s -o vectors.o
arm-none-eabi-as main.s -o main.o
arm-none-eabi-ld vectors.o main.o -T memmap -o main.elf
arm-none-eabi-objdump -D main.elf > main.list
arm-none-eabi-objcopy main.elf -O binary main.bin

результат

main.elf:     file format elf32-littlearm


Disassembly of section .text:

00008000 <_start>:
    8000:   e3a0d902    mov sp, #32768  ; 0x8000
    8004:   eb000000    bl  800c <main>

00008008 <hang>:
    8008:   eafffffe    b   8008 <hang>

0000800c <main>:
    800c:   e3a00002    mov r0, #2
    8010:   e12fff1e    bx  lr

Если вы хотите использовать C вместо asm для main, то

main.c

int main ( void )
{
    return(2);
}

Команды

arm-none-eabi-as vectors.s -o vectors.o
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -c main.c -o main.o
arm-none-eabi-ld vectors.o main.o -T memmap -o main.elf
arm-none-eabi-objdump -D main.elf > main.list
arm-none-eabi-objcopy main.elf -O binary main.bin

результат

main.elf:     file format elf32-littlearm


Disassembly of section .text:

00008000 <_start>:
    8000:   e3a0d902    mov sp, #32768  ; 0x8000
    8004:   eb000000    bl  800c <main>

00008008 <hang>:
    8008:   eafffffe    b   8008 <hang>

0000800c <main>:
    800c:   e3a00002    mov r0, #2
    8010:   e12fff1e    bx  lr

Я предпочитаю использовать имя функции, отличное от основного, потому что некоторые компиляторы добавляют дополнительный багаж, когда видят это имя функции.

vectors.s

.globl _start
_start:
    mov sp,#0x8000
    bl notmain
hang: b hang

main.c

int notmain ( void )
{
    return(2);
}

результат

main.elf:     file format elf32-littlearm


Disassembly of section .text:

00008000 <_start>:
    8000:   e3a0d902    mov sp, #32768  ; 0x8000
    8004:   eb000000    bl  800c <notmain>

00008008 <hang>:
    8008:   eafffffe    b   8008 <hang>

0000800c <notmain>:
    800c:   e3a00002    mov r0, #2
    8010:   e12fff1e    bx  lr

Ответ 2

У меня была та же проблема с попыткой компиляции для STM32F4xx (Cortex M4).

Я бросил Yagarto и переключился на использование GNU Tools ARM Embedded - toolchain (4.8_2014q2):

https://launchpad.net/gcc-arm-embedded

Кажется, работает для меня.