嵌入式链接脚本示例

来源:互联网 发布:date转string java 编辑:程序博客网 时间:2024/06/06 02:23

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
原创粉丝点击