发新帖我要提问
123
返回列表
打印

开新贴,翻译RVDS的scatter文档

[复制链接]
楼主: xinzha
手机看帖
扫描二维码
随时随地手机跟帖
41
xinzha|  楼主 | 2011-1-8 10:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
本帖最后由 xinzha 于 2011-1-8 10:15 编辑

5.3.7 放置ARM库
  可以在分散加载描述中自己指定ARM标准C和C++库的地址。例如
ER 0x2000
{
        *c_t_un_l (+RO)

}
实际上ARM推荐使用*armlib或者*armlib*,这样链接器就可以自动解决库命名问题,以防止将来版本中库的命名方式发生变化。例如:
ER 0x2000
{
        *armlib* (+RO) :所有包含进来的ARM C库

}
示例5-10展示了如何放置库代码。

注意:在5-10中的路径名里使用了正斜杠以保证在Windows,Sun Solaris和Red Hat Linux平台上都能使用。

5-10.png (30.61 KB )

5-10.png

使用特权

评论回复
42
xinzha|  楼主 | 2011-1-8 11:34 | 只看该作者
5.3.8 使用预处理指令
  在分散加载描述文件的第一行指定要激活的预处理器,链接器就会激活相应的预处理流程。命令格式如下:
#! <processor> [pre_processor_flags]
最典型的命令式 #armcc -E
链接器能够处理简单的表达式,只能是有限的几个操作符。包括 +,-,*,/,AND,OR和圆括号。AND 和 OR遵循C操作符优先级规则。
可以在分散加载描述文件的顶部加上预处理指令,例如:
#define ADDRESS 0x20000000
#include "include_file_1.h"

链接器在解析经过预处理的分散加载文件时,会把这些预处理指令作为注释并忽略。

使用特权

评论回复
43
xinzha|  楼主 | 2011-1-8 22:34 | 只看该作者
本帖最后由 xinzha 于 2011-1-8 22:49 编辑

5.4 简单镜像的等同分散加载描述
  在《使用命令行选项生成简单镜像》(飞本文档内容)中描述了通过--reloc,--ro-base,--rw-base,--ropi,--rwpi,和--split来生成各种简单镜像。同样地你也可以通过分散加载文件来实现这些功能。
5.4.1 类型一,一个加载域连续输出域
  本例中的镜像包含一个简单的加载域,三个执行域。执行域在内存表中连续排放。
  --ro-base address指定了包含RO输出端的加载域和执行域地址。例5-11展示了同--ro-base 0x040000相同作用的分散加载描述。此例生成了一个镜像,包含一个命名为LR_1的加载域,地址为0x040000。此镜像中包含三个执行域,命名为ER_RO,ER_RW,ER_ZI,分别包含了RO,RW,ZI输出段,RO,RW是根域,ZI段是在运行时动态生成的。ER_RO的执行地址是0x040000。所有三个执行域使用+offset格式(基于根指示符)在内存中连续存放,这样就做到了一个执行域能够紧跟着前面执行域的末尾存放。

5-11.png (72.01 KB )

5-11.png

使用特权

评论回复
44
xinzha|  楼主 | 2011-1-8 22:47 | 只看该作者
本帖最后由 xinzha 于 2011-1-8 22:50 编辑

使用ropi变量时,执行域同样是连续存放在内存中。--ropi指示包含RO输出端的加载域和执行域是地址无关的。例5-12展示了同命令行--ro-base 0x010000 --ropi相同功能的分散加载描述。
  此例中ER_RO段,也就是RO执行段,继承了加载域LR_1的PI属性。下一个执行域ER_RW被标识为ABSOLUTE属性,并使用+offset格式的基址指示符,这防止了ER_RW段继承ER_RO的PI属性,同样地,由于ER_ZI域使用了+0地址,它就继承了ER_RW的ABSOLUTE属性。

5-12.png (49.46 KB )

5-12.png

使用特权

评论回复
45
xinzha|  楼主 | 2011-1-8 23:10 | 只看该作者
5.4.2 类型二,一个加载域,非连续的输出域 此例中的镜像包含了一个简单的加载域,三个执行域,除RW执行域同RO执行域不连续外,其他方面同类型一类似。 --ro-base address指定了包含RO输出端的加载域和执行域地址。--rw-base address2指定了RW执行域的执行地址。 例5-13展示了同--ro-base 0x010000 --rw-base 0x040000相同功能的分散加载描述。
  此描述生成的镜像包含了一个加载域,命名为LR_1,加载地址为0x010000。
  此镜像中有三个加载域,命名为ER_RO,ER_RW和ER_ZI,分别包含了RO,RW和ZI输出域。RO域是根域,ER_RO的执行地址是0x010000。
  ER_RW执行域同ER_RO不连续,它的执行地址是0x040000。
  ER_ZI在ER_RW的结束地址后放置,同ER_RW连续。

5-13.png (61.94 KB )

5-13.png

使用特权

评论回复
46
xinzha|  楼主 | 2011-1-8 23:19 | 只看该作者
rwpi变量同类型二的镜像类似,RW执行域同RO执行域分离。而--rwpi标识包含RW输出段的执行域是地址无关的。
  例5-14展示了同命令行--ro-base 0x010000 --rw-base 0x018000 --rwpi同等功能的分散加载描述。
  此例中ER_RO段,也就是RO执行段,继承了加载域LR_1的ABSOLUTE属性。下一个执行域ER_RW被标识为PI属性,同样地,由于ER_ZI域使用了+0地址,它就继承了ER_RW的PI属性。

5-14.png (51.04 KB )

5-14.png

使用特权

评论回复
47
xinzha|  楼主 | 2011-1-8 23:39 | 只看该作者
5.4.3 两个加载域,不连续的输出域 类型三镜像包含了两个加载域和三个执行域。它同类型二类似,只是类型二中的加载域在这个例子中被分成了两个。 用如下的链接器选项重定位并分割加载域。 1. --reloc 混合使用--reloc --split生成类似于类型三的镜像,只是这两个加载域有了RELOC属性。 2. -- ro-base address1 指定了包含RO输出段的域的执行和加载地址。 3. --rw-base address2 指定了包含RW输出段的域的执行和加载地址。 4. --split 分割默认的简单加载域(包含RO和RW输出段)为两个加载域,一个加载域包含RO段,一个加载域包含RW段。 例5-15展示了与命令行--ro-base 0x010000 --rw-base 0x040000 --split同样功能的分散加载描述。此例中: 1.这个描述生成的镜像包含两个加载域,分别命名为LR_1和LR_2,加载地址分别为0x010000和0x040000。 2.此镜像中有三个执行域,命名为ER_RO,ER_RW,ER_ZI,分别包含RO,RE和ZI段,ER_RO的执行地址为0x010000。 3.ER_RW执行域同ER_RO不连续,执行地址为0x040000。 4.ER_ZI执行域同ER_RW执行域地址连续。

5-15.png (44.17 KB )

5-15.png

使用特权

评论回复
48
xinzha|  楼主 | 2011-1-8 23:44 | 只看该作者
此例中同样包含了两个加载域和三个执行域,但是使用了--reloc参数指定两个加载域具备RELOC属性,例5-16展示了与--ro-base 0x010000 --rw-base 0x040000 --reloc --split同样功能的分散加载描述。

5-16.png (20.94 KB )

5-16.png

使用特权

评论回复
49
wljs012| | 2011-1-10 09:20 | 只看该作者
支持楼主,关于分散加载文件,尤其是语句的用法结构,其实详细描写的资料非常少。
我当初研究的时候,没少问,可是回答的也很少。所以到现在也不是了解的很透彻。

使用特权

评论回复
50
xinzha|  楼主 | 2011-1-12 13:35 | 只看该作者
这一章翻完了,如果实际不接触这些东西的话,看了会比较晕。接下来想写个arm全局反汇编的工具,锻炼下perl和正则表达式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则