我们在以前的文章里面说过一些链接脚本的应用,但是还是没能系统的介绍,也没有能体现出它的重要性,下面我们来着重介绍一下:
使用ARM使用Realview MDK时不可避免的要涉及到链接脚本文件,特别是编译链接那些大的工程文件时更是如此。在编译大的工程文件的时候,如果不掌握好一些链接脚本的编写方法的话,那么有可能会使内存溢出而编译不通过,这样子那就真的比较麻烦了。那么链接脚本有哪些功能呢?
在链接脚本中可以指定代码的存储布局,可以将代码段、只读数据段、可读写的数据段分别存放,甚至可以精确地指定代码放置的位置,这一点是很NB的,譬如说启动代码就必须放在可知型文件的开始位置。
由于链接脚本重要性,开发者必须掌握其编写的方法。 Realview MDK链接程序使用了两种方式控制程序的链接,即链接控制命令选项和链接脚本文件。这些在哪里打开我相信只要看过偶的以前写的文章都已经知道了吧?在project – options – linker里面,如下图:
点一下edit,我们就可以开始编辑那个链接脚本啦!
内容是:
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00005000 { ; RW data
.ANY (+RW +ZI)
}
}
呵呵。看下面就知道了。
http://blog.ednchina.com/likee/138772/message.aspx
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
当使用链接控制命令选项时,链接器定义了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。
下面在网上抄了两个例子,给大家消化。
例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) ; 所有清零数据都连续地放在这个区域。
}
}
用户158440 2008-8-2 22:38
用户160112 2008-8-2 18:42
用户391193 2008-8-2 00:30
用户154505 2008-8-1 17:03
用户89953 2008-8-1 14:51
daiqiumiao_806246054 2008-8-1 14:42