lds 脚本分析备忘

===============================   博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======


此处以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
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值