使用GNU toolchain时,如何才能不链接标准库?

来源:互联网 发布:光速网络网站 编辑:程序博客网 时间:2024/05/29 07:30
mini_loader.S

1. arm-elf-gcc -Os -c -o loader.o loader.S
2. arm-elf-ld -nostdlib -Bstatic -Ttext 0xff800000 -o loader -Map mini_loader.map loader.o
3. arm-elf-objcopy -O srec loader loader.srec # 生成motorola Srecord
4. arm-elf-objcopy -O binary loader loader.bin # 生成 binary

重点在第二行。参考一下手册获得详细解释,大致意思是程序入口点为 0xff800000,静态链接,不使用标准库。
由于代码的执行不依赖操作系统,因此不能直接运行 elf 文件,而应该直接跳到代码的入口点运行(0xff800000),
第就是第3、4行的作用,根据需要生成 srec 或bin,没有必要都生成。

下面有一个用于复制代码的示例:
功能:从ROM中运行,加电后首先得到执行,然后将一些代码复制到内存中(忽略内存初始化部份),然后跳到
某入口点执行代码(只是示例,不是上面提到的代码哈)。
==================================================
.globl _start
_start:
ldr r0,=SOURCE_ADDR
ldr r1,=TARGET_BASE
ldr r2,=SOURCE_END
copy_loop:
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble copy_loop

mov r0, #91
mov r1, #0
ldr pc, =RUN_FROM_HERE
==================================================
如果要了解更多一点的东东,可以参考一下嵌入式系统常用的loader,如ppcboot,armboot、redboot等。