SECTIONS{
. = 0X10000000;
.text : //代码段
{
start.o
main.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata*)} // 常量数据 ro: read only
.data ALIGN(4) : { *(.data) } //已被初始化为非零的全局变量
__bss_start = .;
.bss ALIGN(4) : { *(.bss) *(COMMON) } //没有被初始化 和 已经被初始化为0 的全局变量
__bss_end = .;
}
1、最简单的链接脚本可以只包含一个命令“ SECTIONS”, 我们可以在这一个“ SECTIONS”里面来描述输出文件的内存布局。
2、“ .”在链接脚本里面叫做定位计数器,默认的定位计数器为 0。我们要求代码链接到以 0X10000000 为起始地址的地方,因此这一行给“ .”赋值0X10000000,表示以 0X10000000 开始,后面的文件或者段都会以 0X10000000 为起始地址开始链接。
3、“ .text”是段名,后面的冒号是语法要求,冒号后面的大括号里面可以填上要链接到“ .text”这个段里面的所有文件,“ *(.text)”中的“ *”是通配符,表示所有输入文件的.text段都放到“ .text”中。
4、ALIGN(4)表示 4 字节对齐。也就是说段“ .data”的起始地址要能被 4 整除。
5、设置链接到开始位置的文件为 start.o,因为 start.o 里面包含着第一个要执行的指令,所以一定要链接到最开始的地方。
6、“ __bss_start”和“ __bss_end”是符号,这两个符号用来保存.bss 段的起始地址和结束地址,这两行其实就是对这两个符号进行赋值,其值为定位符“ .”。
7、我们需要手动对.bss 段的变量清零的,因此我们需要知道.bss 段的起始和结束地址,这样我们直接对这段内存赋 0 即可完成清零。通过第 11、 13 行代码, .bss 段的起始地址和结束地址就保存在了“ __bss_start”和“ __bss_end”中,我们就可以直接在汇编或者 C 文件里面使用这两个符号。