Realview MDK中链接脚本详细解析
2011-07-06 13:49
363 查看
使用Realview MDK时不可避免的要涉及到链接脚本文件,特别是编译链接那些大的工程文件时更是如此。在链接脚本中可以指定代码的存储布局,可以将代码段、只读数据段、可读写的数据段分别存放,甚至可以精确地指定代码放置的位置,这一点是很关键的,譬如说启动代码就必须放在可知型文件的开始位置。由于链接脚本重要性,开发者必须掌握其编写的方法。
Realview MDK链接程序使用了两种方式控制程序的链接,即链接控制命令选项和链接脚本文件。当使用链接控制命令选项时,链接器定义了Image$$RW$$Base、Image$$RW$$Limit、Image$$RO$$Base、Image$$RO$$Limit、Image$$ZI$$Base和Image$$ZI$$Limit等6个段地址描述符。这6个描述符可以直接在程序中引用。而在使用链接脚本文件后,这6个描述符号没有了,取而代之的是链接脚本文件中的段描述符,格式为:Image$$段名$$Base 和Image$$段名$$Limit。下面将结合3个具体的例子说明链接脚本文件的使用。
例1 一个加载区域,多个连续的执行区域。
LR_1 0x040000 ; 定义载入区域LR_1的起始地址为0x040000。
{
ER_RO +0 ; 执行区域ER_RO的起始地址紧接载于区域LR_1的起始地址,即为0x040000.
{
* (+RO) ; 所有的只读代码段都连续地放在这个区域。
}
ER_RW +0 ; 可读写数据段ER_RW紧接ER_RO段的尾地址存放,即0x040000 + ER_RO的容量。
{
* (+RW) ; 所有的可读写的程序都连续地放在这个区域。
}
ER_ZI +0 ; 清零数据段ER_ZI紧接ER_RW段的尾地址存放。
{
* (+ZI) ; 所有清零数据都连续地放在这个区域。
}
}
例2 一个加载区域,多个非连续的执行区域。
LR_1 0x010000 ; 定义载入区域LR_1的起始地址为0x010000。
{
ER_RO +0 ;执行区域ER_RO的起始地址紧接载于区域LR_1的起始地址,即为0x010000.
{
* (+RO) ; 所有的只读代码段都连续地放在这个区域。
}
ER_RW 0x040000 ; 定义可读写数据段ER_RW的起始地址为0x040000.
{
* (+RW) ; 所有的可读写的程序都连续地放在这个区域。
}
ER_ZI +0; 清零数据段ER_ZI紧接ER_RW段的尾地址存放,即为0x040000 + ER_RW的容量。
{
* (+ZI) ; 所有清零数据都连续地放在这个区域。
}
}
例3二个加载区域,多个非连续的执行区域。
LR_1 0x010000 ; 载入区域LR_1的起始地址为0x010000。
{
ER_RO +0 ; ER_RO段的起始地址为0x010000.
{
* (+RO)
}
}
LR_2 0x040000 ; 载入区域LR_2的起始地址为0x040000。
{
ER_RW +0 ; ER_RO段的起始地址为0x010000.
{
* (+RW) ; 所有可读写的数据段都放在这里。
}
ER_ZI +0 ; 清零段ER_Z的起始地址为0x040000 + ER_RW段的容量。
{
* (+ZI) ; 所有清零段ZI的数据都连续的放在这里。
}
}
上面三个例子中,载入区域和执行区域的名字是可以任意命名的,对这些段地址的引用可以使用如Image$$ LR_1$$Base 、Image$$ LR_1$$Limit、Image$$ ER_RW $$Base 和Image$$ ER_RW $$Limit等
转载自互联网
Realview MDK链接程序使用了两种方式控制程序的链接,即链接控制命令选项和链接脚本文件。当使用链接控制命令选项时,链接器定义了Image$$RW$$Base、Image$$RW$$Limit、Image$$RO$$Base、Image$$RO$$Limit、Image$$ZI$$Base和Image$$ZI$$Limit等6个段地址描述符。这6个描述符可以直接在程序中引用。而在使用链接脚本文件后,这6个描述符号没有了,取而代之的是链接脚本文件中的段描述符,格式为:Image$$段名$$Base 和Image$$段名$$Limit。下面将结合3个具体的例子说明链接脚本文件的使用。
例1 一个加载区域,多个连续的执行区域。
LR_1 0x040000 ; 定义载入区域LR_1的起始地址为0x040000。
{
ER_RO +0 ; 执行区域ER_RO的起始地址紧接载于区域LR_1的起始地址,即为0x040000.
{
* (+RO) ; 所有的只读代码段都连续地放在这个区域。
}
ER_RW +0 ; 可读写数据段ER_RW紧接ER_RO段的尾地址存放,即0x040000 + ER_RO的容量。
{
* (+RW) ; 所有的可读写的程序都连续地放在这个区域。
}
ER_ZI +0 ; 清零数据段ER_ZI紧接ER_RW段的尾地址存放。
{
* (+ZI) ; 所有清零数据都连续地放在这个区域。
}
}
例2 一个加载区域,多个非连续的执行区域。
LR_1 0x010000 ; 定义载入区域LR_1的起始地址为0x010000。
{
ER_RO +0 ;执行区域ER_RO的起始地址紧接载于区域LR_1的起始地址,即为0x010000.
{
* (+RO) ; 所有的只读代码段都连续地放在这个区域。
}
ER_RW 0x040000 ; 定义可读写数据段ER_RW的起始地址为0x040000.
{
* (+RW) ; 所有的可读写的程序都连续地放在这个区域。
}
ER_ZI +0; 清零数据段ER_ZI紧接ER_RW段的尾地址存放,即为0x040000 + ER_RW的容量。
{
* (+ZI) ; 所有清零数据都连续地放在这个区域。
}
}
例3二个加载区域,多个非连续的执行区域。
LR_1 0x010000 ; 载入区域LR_1的起始地址为0x010000。
{
ER_RO +0 ; ER_RO段的起始地址为0x010000.
{
* (+RO)
}
}
LR_2 0x040000 ; 载入区域LR_2的起始地址为0x040000。
{
ER_RW +0 ; ER_RO段的起始地址为0x010000.
{
* (+RW) ; 所有可读写的数据段都放在这里。
}
ER_ZI +0 ; 清零段ER_Z的起始地址为0x040000 + ER_RW段的容量。
{
* (+ZI) ; 所有清零段ZI的数据都连续的放在这里。
}
}
上面三个例子中,载入区域和执行区域的名字是可以任意命名的,对这些段地址的引用可以使用如Image$$ LR_1$$Base 、Image$$ LR_1$$Limit、Image$$ ER_RW $$Base 和Image$$ ER_RW $$Limit等
转载自互联网
相关文章推荐
- Realview MDK中链接脚本详细解析
- Realview MDK中链接脚本详细解析
- Realview MDK中链接脚本详细解析
- Realview MDK中链接脚本详细解析
- Realview MDK 中调试脚本的详细解析
- RealView MDK在链接时提示空间不够的解决方案总结
- 转载_RealView MDK在链接时提示空间不够的解决方案总结
- Keil RealView MDK在链接时提示空间不够的解决方案总结 keil: Error: L6406E: No space in execution regions with
- RealView MDK在链接时提示空间不够的解决方案总结
- RealView MDK开发工具 详细介绍
- RealView MDK在链接时提示空间不够的解决方案总结
- TQ2440+RealViewMDK调试LED跑马灯(成功!)
- View的事件传递源码详细解析
- ViewManager、ViewRootImp、WindowManagerImpl、WindowSession等详细解析
- RealView MDK开发工具
- 关于webView的详细解析
- makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析
- <2013 01 18> 从ADS到RealViewMDK —— ARM-MCU新一代集成开发环境
- solr 5.0.0 bin/start脚本详细解析
- Keil for ARM/ Realview MDK 中用JTAG调试的方法 && keil c 的在线调试与断点设置