=============================== 博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======
此处以Marvell mc200 的链接脚本加以注释分析,详细的链接脚本学习,可以看我上传的资料(该链接脚本学
习资料,在网上下载的,源地址未知,对资源提供者表示感谢),资料地址为:http://download.csdn.net/detail/wang112031/9310639 在嵌入式开发环境中,SRAM空间及其有限的时候,分析lds链接脚本,了解代码在SRAM中的布局,尤为重要,当SRAM空间略微不足的,我们可以通过修改链接脚本加以适当调整。脚本注释如下。
=================================================================
/*
* Copyright (C) 2008-2013, Marvell International Ltd.* All Rights Reserved.
*/
/*
在程序运行时第一个被执行的指令称为“入口点”
有多种不同的方法来设置入口点,连接器会通过按顺序尝试以下的方法来设置入口点,如果成功了就会停止。
1)'-e' 入口命令行选项
2)连接脚本中的‘ENTRY(SYMBOL)’
3)如果定义了start,就使用start的值
4)如果存在,就是用‘.text’的首地址
5)地址'0'
此处的入口点为:Reset_IRQHandler
*/
ENTRY(Reset_IRQHandler)
/*定义主栈区指针,栈区指针由高地址向低地址增长 */
_estack = 0x20020000; /* end of 128K SRAM1 */
/*定义堆区地址大小*/
_heap_size = (72 * 1024);
_min_stack_size = 0x800; /* 定义最小栈区大小 */
/*
MEMORY 命令描述目标平台上内存块的位置与长度,用于描述那些内存区域可以
被连接器使用,那些内存区域避免使用
MEMORY
{
NAME [(ATTR)] : ORIGIN = ORIGIN, LENGTH = LEN}
NAME 链接脚本中引用内存区域的名字
ATTR 可选的属性列表 'R','W','X','A'可分配,'I' 已初始化区 ‘!’ 对前一个属性取反*/
ORIGIN(可以缩写为org 或o)内存区域起始地址
LENGTH(可以缩写为len 或l)内存区域长度
*/
MEMORY
{
SRAM0 (rwx) : ORIGIN = 0x00100000, LENGTH = 384K}
SRAM1 (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
NVRAM (rw) : ORIGIN = 0x480C0000, LENGTH = 4K
SECTIONS
{
.text : /*定义text段*/
{
. = ALIGN(256); /* 调整定位器到256byte 对齐处*/KEEP(*(.isr_vector)) /*连接器可能将某些它认为没用的section过滤掉,此处使用KEPP强制保留isr_vector 段*/. = ALIGN(4); /*调整定位器到4byte 对齐处*/*(.text.Reset_IRQHandler) /*放text段的Reset_IRQHandler部分*/*(.text .text.* .gnu.linkonce.t.*) /*放text段的其他部分*/*(.rodata .rodata.* .gnu.linkonce.r.*) /*放rodata部分*/
. = ALIGN(4);/*调整定位器到4byte 对齐处*/
_etext = .; /*将text后的地址赋值给 _etext*/
} > SRAM0 /*section描述的> REGION属性显示地将该输出section限定于某块存储区域 此处内存区域为SRAM0*/
.heapdata (NOLOAD):/*定义heapdata段 NOLOAD 标记表示 该section在程序运行时,不被载入内存*/*/
{
. = ALIGN(4); /*调整定位器到4byte 对齐处*/_heap_start = .; /*4 byte对齐后将当前地址赋值给_heap_start */. += _heap_size; /*当前定位器地址加_heap_size 大小 */. = ALIGN(4); /*调整定位器至4 byte 对齐处*/_heap_end = .; /*调整后的地址赋值给 _heap_end*/
} > SRAM0
/*ASSERT(EXP, MESSAGE) EXP 为假,链接终止,打印输出MESSAGE*/
ASSERT((_heap_end - _heap_start) >= _heap_size, "Text overflow in heap area.")
.data : /*定义data段*/
{
_data = .;*(.data) /*所有的data段*/*(.data.*) /*data后放置与data段相关的数据*/_edata = .;
} > SRAM1
/*
* NOTE: Please do not move the below section ".iobufs" to SRAM0.
* Some of the peripherals (e.g. USB, SDIO) with their own DMA engines
* have a requirement that the data buffers for DMA need to be in the
* "Data" memory (SRAM1). The peripherals that use internal DMA engine
* of MC200 (e.g. UART) can use data buffers from SRAM0 or SRAM1.
*/
.iobufs (NOLOAD):
{
. = ALIGN(4);_iobufs_start = .;*(.iobufs)*(.iobufs.*)_iobufs_end = .;
} > SRAM1
.bss (NOLOAD):
{
_bss = .;*(.bss)*(.bss.*)*(COMMON)_ebss = .;
} > SRAM1
/* Check for enough space for stack */
._main_stack :
{
. = ALIGN(4);. = . + _min_stack_size;. = ALIGN(4);
} > SRAM1
.nvram (NOLOAD): /*NOLOAD 该section在程序运行时,不被载入内存*/
{
/* BootROM uses first few bytes of retention ram */_nvram_start = .;. = . + 64;. = ALIGN(4);/* Zero initialized on bootup */_nvram_begin = .;*(.nvram)*(.nvram.*)_nvram_end = .;/* Un-initialized nvram section */. = ALIGN(4);*(.nvram_uninit)*(.nvram_uninit.*)
} > NVRAM}