| | |

mdk-九游会网页

问题类别:arm 开发工具 > mdk-arm 浏览次数:2651
发布日期:2012/4/23 14:46:23 文章来源:米尔科技
回复日期:2012/5/7 17:31:06
realview mdk中国版3.05以上
请问有没有链接脚本的详细解析?

问题分析:

    使用mdk-arm时不可避免的要涉及到链接脚本文件,特别是编译链接那些大的工程文件时更是如此。在链接脚本中可以指定代码的存储布局,可以将代码段、只读数据段、可读写的数据段分别存放,甚至可以精确地指定代码放置的位置,这一点是很关键的,譬如说启动代码就必须放在可知型文件的开始位置。由于链接脚本重要性,开发者必须掌握其编写的方法。

解决办法:

       mdk-arm链接程序使用了两种方式控制程序的链接,即链接控制命令选项和链接脚本文件。当使用链接控制命令选项时,链接器定义了image$$rw$$baseimage$$rw$$limitimage$$ro$$baseimage$$ro$$limitimage$$zi$$baseimage$$zi$$limit6个段地址描述符。这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$$limitimage$$ er_rw $$base image$$ er_rw $$limit等。

九游会网页的技术支持服务指南

常见问题解答

网站地图