当应用程序运行在操作系统之上时,不需要显示的指定链接脚本,因为自己编写的链接脚本可能与操作系统默认环境不符,为了保证程序正常运行,使用编译器默认链接脚本,可以使用arm-linux-ld -verbose来查看该链接脚本
当程序运行在裸机情况或者操作系统本身,这是链接脚本就特别重要了
链接脚本格式
SECTIONS
{
sections-command
sections-command
......
}
一个SECTIONS命令由若干个sections-command组成,通过该命令我们可以设计出程序各段在内存中分布情况,即链接地址
一个典型的链接脚本如下:
ENTRY(start.o)
SECTIONS
{
.=0x1000000;
.text : {
*(.text);
}
.=0x2000000;
.data ALIGN(32) :{
*(.data);
}
.bss ALIGN(32) :{
*(.bss);
}
}
解析:
1. (.)号是位置计数器,代表了当前位置,可以将值赋给它.如0x1000000代表了代码段的起始位置。可以将当前位置赋给变量在源程序中使用
2. 输出段定义: .text,.data,.bss代表了个段的段名,但是输出的实际内容与段名无关,段名是可以随便取的。而是与花括号里面的内容是相关的,*(.text)表示目标文件的所有代码段都被链接到这一区域。.bss段的当前地址没有指定,则采用默认的值,即当前值等于0x2000000加上data段的值,很多情况bss段都是紧挨着data段存放着。
3. ALIGN(N) 以N字节对齐,在data段和bss段一定要对齐
4.ENTRY(start.o) 表示程序的入口
写完后就可以arm-linux-ld -T xxx.lds *.o -o xxx