基础概念
- object file——ld链接器的输入文件
- executable——ld链接器的输出文件
- section——每个节都有名字和大小,大部分节以一块数据区相联系,一个节包含可加载,可分配等属性,如果及不可加载,也不可分配,可能包含的是调试信息
- VMA——虚拟内存地址
- LMA——线性内存地址,一般与VMA值相同
- symbol table——符号表,包含程序中所有的符号定义,如果未定义某符号,在这里就不可能找到,当然也不可能链接成功
简单链接脚本实例
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
SECTIONS是一个指令,链接器在链接目标文件时通过执行链接脚本中的指令来完成链接过程。
如上代码所示,’.’是一个特殊的符号,用于记录当前位置,第一行指定了程序的.text节从地址0x10000开始,第二行用于表示.text节内容,‘:’是语法需要,其后表示.text节内容的来源,其中’*’是通配符,表示链接器的所有输入文件,*(.text)则表示链接器所有输入文件中的.text节。
.data,与.bss与.text类似,链接脚本实际上定义了可执行文件在内存加载后实际的布局结构,即在实际程序运行时,.text就是加载在0x10000的内存地址,.data加载在0x8000000的内存地址,.bss加载在紧随.data后开始的内存地址处。
链接脚本中的指令
ENTRY(symbol)
描述:这个指令用于指定一个可执行文件的入口地址,链接器在执行链接操作时顺序执行如下动作去设置程序入口地址,直到程序入口地址被成功设置。
- ld命令的”-e”命令行选项
- ENTRY(symbol)这个链接脚本命令
- 通过搜索start符号来确定入口地址
- .text节的开始地址
- 0x0地址
INCLUDE filename
描述:用于在一个链接脚本中包含其它链接脚本,最高可包含深度达10层,搜索路径为当前所在目录,也可在链接时用-L选项指定INCLUDE命令的搜索路径,类似C语言中引用头文件
INPUT(file, file, …)
INPUT(file file …)
描述:指定输入文件名,如INPUT(entry.o), INPUT(-lfile),前一个好理解,后一个表示将名为libfile.a的文件作为输入。对于输入文件的搜索路径可通过-L选项制定,若不指定,将默认以当前ld链接器执行的路径作为搜索路径。
GROUP(file, file, …)
GROUP(file file …)
描述:这个指令与INPUT指令类似,唯一的区别是GROUP只以档案文件(*.a)作为输入。
OUTPUT(filename)
描述:制定链接后输出文件的名字
SEARCH_DIR(path)
描述:类似-L选项,制定搜索路径
STARTUP(filename)
OUTPUT_FORMAT(bfdname)
OUTPUT_FO