链接器预定义变量_etext,_edata,_end

本文详细介绍了链接器ld和ld86如何使用预定义变量记录执行程序中各段的逻辑地址,包括_etext、edata、end等变量的含义及作用,通过链接脚本示例展示了.text、.data和.bss段的地址分配过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载于 ”https://m.zol.com.cn/article/1271513.html“

在链接过程中,链接器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 = . ;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值