如何解决交叉编译中的crt0.o链接问题? [英] How to resolve crt0.o linking issue in cross compiling?
问题描述
如何添加 ctr0.o
?
我得到这个错误:
yagarto-4.7.2 / bin / arm-none-eabi-ld:can not find crt0.o:No such file or directory
collect2:error:ld returned 1 exit status`
同时编译非常简单的程序,从 here :
/ * - first.s * /
/ *这是一个注释* /
.global main / *'main'是我们的入口点,必须是全局的* /
.func main / *'main'是一个函数* /
main:/ *这是main * /
mov r0,#2 / *在寄存器r0 * /
中放置一个2 bx lr / *从主返回* /
我已经看到了这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:找不到条目符号_start;默认为0000000000008000
vectors.s
.globl _start
_start:
mov sp,#0x8000
bl
hang:b hang
main.s
.globl main
main:
mov r0,#2
bx lr
memmap(linker script)
内存
{
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二进制main.bin
result
main.elf:文件格式elf32-littlearm
反汇编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
如果您想为main使用C而不是asm,那么
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 -freestanding -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二进制main.bin
result
main.elf:文件格式elf32-littlearm
反汇编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
我更喜欢使用除main之外的函数名称,因为有些编译器在看到该函数名称时会添加额外的行李。
vectors.s
.globl _start
_start:
mov sp,#0x8000
bb notmain
hang:b hang
main.c
int notmain(void)
{
return(2);
}
结果
main.elf:文件格式elf32-littlearm
反汇编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
How to add ctr0.o
?
I get this error:
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`
while compiling very simple program from 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 */
I have seen these 2 threads and didn't get any full and straight forward answer:
- http://www.raspberrypi.org/phpBB3/viewtopic.php?t=50046
- What is the rationale behind removing crt0.o from gcc4.7.x?
I have these files, what is the difference between crt0 and crtn can't I use it?
./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
The SO solution gives a workaround which doesn't work either:
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
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 script)
MEMORY
{
ram : ORIGIN = 0x8000, LENGTH = 0x10000
}
SECTIONS
{
.text : { *(.text*) } > ram
.bss : { *(.bss*) } > ram
}
commands
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
result
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
If you want to use C instead of asm for main then
main.c
int main ( void )
{
return(2);
}
commands
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
result
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
I prefer to use a function name other than main because some compilers add extra baggage when they see that function name.
vectors.s
.globl _start
_start:
mov sp,#0x8000
bl notmain
hang: b hang
main.c
int notmain ( void )
{
return(2);
}
result
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
这篇关于如何解决交叉编译中的crt0.o链接问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!