官方文档:https://sourceware.org/binutils/docs-2.30/ld/index.html#SEC_Contents
下面通过链接脚本和实例进行讲解说明:
SECTIONS
SECTIONS {
outputa 0x10000 :
{
all.o
foo.o (.input1)
}
outputb :
{
foo.o (.input2)
foo1.o (.input1)
}
outputc :
{
*(.input1)
*(.input2)
}
}
最简单的链接脚本可以只包含SECTIONS,其中outputa、outputb等都是输出文件中的sections的名称,其后跟随的中括号里面的内容是相应的输入部分。
这段代码告诉链接器读取all.o文件的所有部分,并将它们放置在输出文件的.outputa的开头,该部分的起始地址为0x10000。文件foo.o中的所有名为.input1的部分随即被放置在all.o内容的后面。
foo.o文件中.input2 sections的部分被放到输出文件的.outputb部分,其次是foo1.o文件中的.input1 sections。
*为通配符,匹配所有文件,将所有文件中的.input1和 .input2 sections都写到.outputc section。
由于.outputb和.outputc sections都没有定义起始地址,因此它们的内容紧跟在.outputa后面。
简单脚本命令
ENTRY
ENTRY(__start)
设置程序运行的第一条指令所在的位置,此处为__start。
INPUT
INPUT(file, file, …)
设置每次链接时都要用到的文件,相当于-l file。若设为INPUT(-lfile),则会被转化为-libfile.a。
OUTPUT
OUTPUT(filename)
设置输出文件的名称,相当于 -o filename
INCLUDE
INCLUDE filename
设置链接脚本,这个文件会从当前文件夹中被搜索,或者从-L选项后面的文件夹下搜索。
SEARCH_DIR
SEARCH_DIR(path)
设置搜索归档库的路径,相当于 -L path
赋值
简单赋值
symbol = expression ;
symbol += expression ;
symbol -= expression ;
symbol *= expression ;
symbol /= expression ;
symbol <<= expression ;
symbol >>= expression ;
symbol &= expression ;
symbol |= expression ;
symbol必须是已定义的,其中.是一种特殊的符号,表示地址,只能在SECTIONS里面使用,expression同c语言。
PROVIDE
用于定义被引用但未定义的符号
PROVIDE(symbol = expression);
当symbol已被定义时,使用该已有定义;若symbol未被定义且被引用,则使用PROVIDE中的定义。
定义在高级语言中的symbol和定义在链接脚本中的symbol不同,前者在内存中存储,而后者只有地址,而没有具体的被分配的内存和value,因此高级语言访问脚本symbol时,只能涉及地址。