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