SECTIONS
{
. = 0×10000;
.text : {
*
(.text) }
. = 0×8000000;
.data : { *(.data) }
bss_start =.;
.bss : { *(.bss) }
__bss_end = .;
}
解释一下上述的例子:
. = 0×10000 : 把定位器符号置为0×10000 (若不指定, 则该符号的初始值为0).
.text : { *(.text) } : 将所有(*符号代表任意输入文件)输入文件的.text section合并成一个.text section, 该section的地址由定位器符号的值指定, 即0×10000.
. = 0×8000000 :把定位器符号置为0×8000000
.data : { *(.data) } : 将所有输入文件的.data section合并成一个.data section, 该section的地址被置为0×8000000.
.bss : { *(.bss) } : 将所有输入文件的.bss section合并成一个.bss section,该section的地址被置为0×8000000+.data section的大小.
连接器每读完一个section描述后, 将定位器符号的值*增加*该section的大小. 注意: 此处没有考虑对齐约束.考虑对其. =ALIGN(4);
在许多目标文件格式中,通用符号并没有占用一个section。连接器认为:输入文件的所有通用符号在名为COMMON的section内。
例子,
.bss
{ *(.bss) *(COMMON) }
这个例子中将所有输入文件的所有通用符号放入输出.bss section内,bss段用于放全局变量为0的数据,我们可以用memset清0
整个文件大小:用bss_start =.;减去0x10000就是整个文件的大小