You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何__bss_start与__bss_end并非直接表示地址?

问题与分析

开发场景与操作

我在Xilinx 7000 Zynq双ARM处理器平台开发,原本以为用的是GNU链接器,但现在不确定。我在链接脚本里定义了一个共享内存段:

.shared_mem (NOLOAD) : {
    my_memory = .;
} > ps7_ram_1

在C代码里我用extern char* my_memory;声明这个符号,实际调试中这个指针能正常读写内存,确实指向ps7_ram_1的起始地址,符合预期。

核心疑问

但获取.bss段起始地址时,必须取__bss_start的地址(即&__bss_start)——直接用__bss_start会得到0(这是.bss段的初始内容)。这看起来__bss_start像是一个零大小的对象名,取地址才能得到.bss段的起始地址。

可__bss_start和__bss_end的定义方式和my_memory完全一致:

__bss_start = .;

为什么__bss_start、__bss_end本身不是地址?其他标准内存段的起止符号也有同样的问题。

更新说明

看到Mark Ransom的评论后,我意识到是自己混淆了概念:__bss_start的表现才是正确的,反而是my_memory的表现异常。不过隔了一夜再次调试时,问题又“消失”了——我确定之前的问题真实存在且持续,但目前不清楚原因。把C代码里对my_memory的引用改成对象(而非指针)后就能正常工作,暂时先搁置,后续再排查。


内容的提问来源于stack exchange,提问作者Rich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:04:53