在链接过程中,链接器ld和ld86会使用变量记录下执行程序中每个段的逻辑地址。因此在程序中可以通过访问这几个外部变量来获得程序中段的位置。链接器预定义的外部变量通常至少有etext、_etext、edata、_edata、end和_end。
变量名_etext和etext的地址是程序正文段结束后的第1个地址;_edata和edata的地址是初始化数据区后面的第1个地址;end和end的地址是未初始化数据区(bss)后的第1个地址位置。带下划线’'前缀的名称等同于不带下划线的对应名称,它们之间的唯一区别在于ANSI、POSIX等标准中没有定义符号etext、edata和end。
以如下链接脚本为例:
SECTIONS
{
.text :
{
start = . ;
_start = . ;
__start = . ;
*(.text)
etext = . ;
}
.data :
{
__data_start__ = . ;
*(.data)
__data_end__ = . ;
__rdata_start__ = . ;
*(.rdata)
__rdata_end__ = . ;
*(.pdata)
edata = . ;
_edata = . ;
__edata = . ;
}
.bss :
{
__bss_start__ = . ;
*(.bss)
__common_start__ = . ;
*(COMMON)
__bss_end__ = . ;
}
.edata :
{
*(.edata)
end = . ;
_end = . ;
__end = . ;
}