【发布时间】:2017-03-11 15:49:57
【问题描述】:
我是嵌入式系统低级编程的新手,我很困惑在链接器生成输出目标文件之后以及在刷新 .bin 文件期间究竟发生了什么。
1- 我在链接描述文件中看到 .bss 部分的 可加载内存地址(LMA) 和 虚拟内存地址(VMA) 在 RAM 中,我的问题是自从我在闪存中闪存我的二进制图像后,它最初是如何进入 RAM 的?
2- 我看到的启动代码仅将 RAM 中的 .bss 部分清零,但是如果启动代码没有像使用 .data 部分那样将其复制到 RAM 中,它是如何到达那里的?
【问题讨论】:
-
您可以通过检查哪些变量转到
.bss以及它们具有哪个初始值来回答这个问题。不清楚你的问题是什么。 -
@Olaf 我知道 .bss 包含未初始化的变量,但我们是否还需要对具有零值的非局部变量的引用?我的意思是我们实际上是闪存 .bss 部分还是我们只是在运行时创建一个填充零的部分?
-
“我明白 .bss 包含未初始化的变量” - 不,它没有!您可能想了解更多有关此内容的信息。另请注意,标准本身和平台相关的标准中甚至都没有提到这一点。
-
.bsssection 不是 gcc 中.datasection* 的一部分,而是一个单独的NOLOAD部分!检查您的链接器控制文件,阅读 ld 文档。细分是另一回事。 “不,它没有” - 我引用了错误的假设,不清楚你不明白什么,但也许你听从了我的建议并阅读了标准。提示:进入.bss以支持它的实现的对象已初始化!事实上,你自己已经说过了。善意:有时退后一步看全貌是件好事。如果您离得太近,您只会看到彩色圆点。 -
我认为您的问题是页面底部附近的answered in the manual under output section LMA。通常,您需要一些汇编程序启动代码来将 init 数据 复制到 RAM、设置堆栈并将 BSS 归零。然后你可以调用一个最小的“C”函数。
标签: c linker gnu ld linker-scripts