Linux LDS 文件格式详细分析.pdf
LDS 文件格式分析
连接脚本的格式
====================
连接脚本是文本文件.
你写了一系列的命令作为一个连接脚本. 每一个命令是一个带有参数的关键字,或者是一个
对符号的赋值. 你可
以用分号分隔命令. 空格一般被忽略.
文件名或格式名之类的字符串一般可以被直接键入. 如果文件名含有特殊字符, 比如一般作
为分隔文件名用的逗
号, 你可以把文件名放到双引号中. 文件名中间无法使用双引号.
你可以象在 C 语言中一样,在连接脚本中使用注释, 用'/*'和'*/'隔开. 就像在 C 中,注释在语法
上等同于空格.
简单的连接脚本示例
============================
许多脚本是相当的简单的.
可能的最简单的脚本只含有一个命令: 'SECTIONS'. 你可以使用'SECTIONS'来描述输出文
件的内存布局.
'SECTIONS'是一个功能很强大的命令. 这里这们会描述一个很简单的使用. 让我们假设你
的程序只有代码节,
初始化过的数据节, 和未初始化过的数据节. 这些会存在于'.text','.data'和'.bss'节, 另外, 让我
们进一
步假设在你的输入文件中只有这些节.
对于这个例子, 我们说代码应当被载入到地址'0x10000'处, 而数据应当从 0x8000000 处开始.
下面是一个实现
这个功能的脚本:
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
你使用关键字'SECTIONS'写了这个 SECTIONS 命令, 后面跟有一串放在花括号中的符号赋
值和输出节描述的内容.
上例中, 在'SECTIONS'命令中的第一行是对一个特殊的符号'.'赋值, 这是一个定位计数器.
如果你没有以其
它的方式指定输出节的地址(其他方式在后面会描述), 那地址值就会被设为定位计数器的现
有值. 定位计数器
然后被加上输出节的尺寸. 在'SECTIONS'命令的开始处, 定位计数器拥有值'0'.
第二行定义一个输出节,'.text'. 冒号是语法需要,现在可以被忽略. 节名后面的花括号中,你列
出所有应当被
放入到这个输出节中的输入节的名字. '*'是一个通配符,匹配任何文件名. 表达式'*(.text)'意
思是所有的输
入文件中的'.text'输入节.
因为当输出节'.text'定义的时候, 定位计数器的值是'0x10000',连接器会把输出文件中的'.text'
节的地址设
为'0x10000'.
余下的内容定义了输出文件中的'.data'节和'.bss' 节. 连接器会把'.data'输出节放到地址
'0x8000000'处. 连接
器放好'.data'输出节之后, 定位计数器的值是'0x8000000'加上'.data'输出节的长度. 得到的结
果是连接器会
把'.bss'输出节放到紧接'.data'节后面的位置.
连接器会通过在必要时增加定位计数器的值来保证每一个输出节具有它所需的对齐. 在这
个例子中, 为'.text'
和'.data'节指定的地址会满足对齐约束, 但是连接器可能会需要在'.data'和'.bss'节之间创建一
个小的缺口.
就这样,这是一个简单但完整的连接脚本.
简单的连接脚本命令.
=============================
在本章中,我们会描述一些简单的脚本命令.
设置入口点.
在运行一个程序时第一个被执行到的指令称为 入口点". 你可以使用'ENTRY'连接脚本命令
来设置入口点.参数
是一个符号名:
ENTRY(SY