嵌入式链接脚本示例

1 篇文章 0 订阅
1 篇文章 0 订阅

MEMORY

{

/* boot ram area, only used for boot.S, merge this section whit run_ram if  normal code can run at this section */

boot_ram : ORIGIN = 0x01000000, LENGTH = 0x0100

/* run ram area, used for normal text, copy LMA to VMA if need boot section */

run_ram : ORIGIN = 0x02000000, LENGTH = 0x010000

/* reserve ram area, used for bss/heap/stack, bss need clear to 0 */

rsv_ram : ORIGIN = 0x04000000, LENTH = 0x01000

}


SECTIONS

{

.boot :

{

KEEP(*.(.text.Start_Entry))

*.o(.boot)

} > boot_ram


text_vma = ALIGN(4);

.text : AT(text_vma)

{

KEEP(*(.text.main))

*.o(.text*)

*.(.rodata*)

} > run_ram


data_vma = ALIGN(4);

.data ALIGN(4) : AT(data_vma)

{

*(.data*)

} > run_ram


bss_vma = ALIGN(4);

.bss SIZEOF(.data) + ADDR(.data) : AT(bss_vma)

{

bss_start_addr = ALIGN(0x08);

*(.bss*)

*(COMMON)

bss_end_addr = ALIGN(0x08);

} > rsv_ram


.heap (COPY):

{

__end__ = .;

end = __end__;

*(.heap*)

__HeapLimit = .;

} > rsv_ram


.stack :

{

stack_base_addr = ALIGN(0x08);

*(.stack)

stack_top = ALIGN(0x08);

} > rsv_ram

}


boot.S 

. cpu armx

.arm

.global main

.section .boot,"ax",%progbits


.type Start_Entry, %function

Start_Entry:

xxx

@ copy to run_ram

ldr r0, =text_vma

ldr r1, =main

ldr r2, =data_vma

copy_to_rumram:

ldr r3, [r0], #4

str r3, [r1], #4

cmp r1, r2

blo copy_to_runram


ldr r0, =bss_start_addr

ldr r1, =bss_end_addr

mov r2, #0

init_bss_loop:

str r2, [r0, #4]!

cmp r1, r0

bne init_bss_loop


ldr r0, =main

bx r0


比较简单,不支持 C++,后续会继续修改完善。

参考:http://www.embeddedlinux.org.cn/html/xinshourumen/201203/04-1989.html

http://11383016.blog.51cto.com/11373016/1867197

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值