2013-08-24 16 views
10

ctr0.oを追加するには? hereから非常に簡単なプログラムをコンパイル中クロスコンパイルでcrt0.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` 

::私はこれらの2つのスレッドを見ていると、任意の完全かつまっすぐな答えを得ることはありませんでした

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

は、私はこのエラーを取得する

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

私はこれらのファイルを持っていますが、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 

答えて

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(リンカースクリプト)

その後、
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 

あなたがメインのための代わりにASMのCを使用したい場合は

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

crt0を取り除くように注意する必要があります。その機能を何らかの方法で置き換える必要があります(置き換えるか、意図的に行う必要はありません)。 http://github.com/dwelch67/raspberrypiにもっとベアメタルのラズベリーパイの例があります –

1

私はSTM32F4xx(のCortex M4)用にコンパイルしようとすると同じ問題を抱えていました。

私はYAGARTOを不時着し、GNUツールを使用してに切り替え組み込みARM - ツールチェーン(4.8_2014q2):

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

は私のために動作するようです。

+2

例を共有する –

関連する問題