为何__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
相关产品推荐
相关产品推荐

