Scatter file

概念

段(Section):分为输入段(Input-Section)和输出段(Output Section),是连接器操作的基本单位,段有三种属性,只读RO,读写RW,和Zero-Initialize(ZI,初始化为0的可读写数据)

Image(映像):连接器将目标文件(Object)和库(Lib)链接之后输出即是Image文件,Image通常是可执行的二进制文件(也可能是不可执行的资源文件),在Image中通常包含了只读的code和data,初始化的数据。

Load Region(加载区):在系统上电后,Image被加载到目标系统中(通常是bootloader将Image搬到RAM中),这个时候Image还没有开始执行(即内核文件还未解压),此时各个段子RAM中的区域就是Load Region。

Execution Region(执行区):系统上电加载到RAM中以后开始执行,这时内核就需要解压。内核解压就是要将RW数据和ZI数据在指定的区域进行初始化,初始化为指定的初始值或0,这些指定的区域就是执行区。另外RO

有多种方法可以将函数和数据放在特定的地址

如果需要,编译器通常从单个源文件生成ro、rw、zi和xo部分。这些部分包含源文件中的所有代码和数据。若要将单个函数或数据项置于固定地址,必须使链接器能够独立于输入文件的其余部分处理函数或数据。

1,您可以创建一个分散文件,该文件只需要选择一个段的段描述在所需地址定义执行区域。

2,对于特殊命名的分区,链接器可以从分区名称中获取放置地址。这些特别命名的部分称为__at段。

要将函数或变量放在特定地址,必须将其放在自己的节中。有几种方法可以做到这一点:

1,将函数或数据放在拥有的源文件中

2,使用__attribute__((at(address)))将变量放在特点地址的不同段

3,使用__attribute__((section("name")))将函数和变量放在命名段中

4,汇编语言中使用AREA指令,在汇编代码中,最小可定位的单位是AREA

5,使用--split_sections编译器选项去生成ELF段

有 __attribute__((section("name")))的代码和数据的位置

参考文章

https://wenku.baidu.com/view/aff79eb6ab00b52acfc789eb172ded630b1c98fb.html

<ARM Development tools>

发布了8 篇原创文章 · 获赞 1 · 访问量 3629

猜你喜欢

转载自blog.csdn.net/qq_15548761/article/details/89873397