2017-04-07 80 views
-1

如果我不在.data.bss部分中映射全局变量,会发生什么情况。当我尝试将其映射到除.bss.data以外的其他部分时,它会占用一些垃圾值。我可以将全局变量映射到.data或.bss节以外的节吗?

我们能不能定义除.bss.data以外的全局变量的其他部分?

+2

C会给你这个选择吗? –

+0

我们可以为.bss或.data以外的全局变量定义其他部分吗?当然,只要你不需要它初始化。您可能需要将该部分放在可写段中:)与您友好的邻居链接器交谈。 – ThingyWotsit

+0

发生什么事的简短答案是,当函数/程序启动时,您可能无法获得您对这些变量所期望的值。 –

回答

2

执行main()之前,会发生内存设置。

对于嵌入式环境,构建的工具(编译器,链接器等)通常会带有名为“crte”(C运行时环境)的代码文件,其中包含代码。也许只有当你与编译器制造商签订特殊(昂贵的)合同时,否则他们可能不会让你了解这一点。
该代码将用“0”和“数据”部分填充具有定义值的“bss”部分。通常这些定义的值可以在非易失性存储器的另一个部分找到,称为“data.rom”,它只是被复制到“data”部分。

如果您创建另一个部分,它不会自动获得该便捷的服务。不是没有特殊的预防措施。结果是上电后恰好在内存中的值。不是一个非常好的随机数发生器,但非常不可预测。这将匹配你的描述为“垃圾值”。

要么找出如何让crte做到这一点,要么自己做。
获取crte的方法可能是链接器指令文件。它应该允许用户定义部分的配置。也许像“init0”或“init .rom”。该手册当然应该为您的环境定义。

为了自己做(可能是商业上不太理想的方法,即风险太大,太耗时),“只是”确保执行一些代码,将值写入该部分 - 在首次访问变量之前。链接器可能会将符号发布到编译器可见的标识符列表中,如“__linker_section__begin”和“__linker_section__end”。使用这些来获得正确的内存地址。

0

这取决于你的编译器,它应该是那个标记为.bss或.data的数据,然后在你的链接器脚本中,你可能没有选择它们在哪个部分,但你肯定有选择他们去哪里,如果你开始搞砸了,你可能不得不惹恼将数据移动到内存(如果需要)和零.bss的bootstrap。但同时取决于你的系统和链接脚本,你可能不需要做任何一个(比如像rapberry pi这样基于ram的二进制文件,并且你将.bss放在使用gnu链接器的.data之前,你也不必移动。数据也不必为零,因为objcopy to binary会将它放在图像中)。

您使用C语言定义的全局变量的编译器是否可以标记为.bss或.data以外的内容?你怎么做?

相关问题