2013-08-24 38 views
10

Làm cách nào để thêm ctr0.o?Làm thế nào để giải quyết vấn đề liên kết crt0.o trong biên dịch chéo?

tôi nhận được lỗi này:

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` 

khi biên dịch chương trình rất đơn giản từ here:

/* -- 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 */ 

Tôi đã thấy những 2 chủ đề và đã không nhận được bất kỳ câu trả lời đầy đủ và thẳng về phía trước:

  1. http://www.raspberrypi.org/phpBB3/viewtopic.php?t=50046
  2. What is the rationale behind removing crt0.o from gcc4.7.x?

Tôi có những tệp này, sự khác biệt giữa crt0 và crtn tôi không thể sử dụng nó là gì?

./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 

Giải pháp SO đưa ra một cách giải quyết mà không làm việc, hoặc:

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 

Trả lời

9

vectors.s

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

main.s

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

memmap (linker tập lệnh)

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

lệnh

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 

kết quả

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 

Nếu bạn muốn sử dụng C thay vì asm cho chính sau đó

main.c

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

lệnh

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 

kết quả

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 

Tôi thích sử dụng một tên hàm khác hơn chính bởi vì một số trình biên dịch bổ sung thêm hành lý khi họ thấy rằng tên hàm.

vectors.s

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

main.c

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

kết quả

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

Bạn phải cẩn thận thoát khỏi crt0, bạn phải thay thế chức năng đó theo một cách nào đó (thay thế nó hoặc cố ý làm mà không có). Tôi có thêm nhiều ví dụ về mâm xôi kim loại ở http://github.com/dwelch67/raspberrypi –

1

tôi đã cùng một vấn đề với cố gắng để biên dịch cho STM32F4xx (Cortex M4).

Tôi đã bỏ Yagarto và chuyển sang sử dụng GNU cụ ARM nhúng - toolchain (4.8_2014q2):

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

Dường như làm việc cho tôi.

+2

Chia sẻ một ví dụ –

Các vấn đề liên quan