C 是否可以将全局变量映射到.data或.bss节以外的节?

C 是否可以将全局变量映射到.data或.bss节以外的节?,c,embedded,C,Embedded,如果我不在.data或.bss部分映射全局变量,会发生什么情况。当我尝试将它映射到.bss和.data之外的其他部分时,它会占用一些垃圾值 除了.bss或.data之外,我们是否可以为全局变量定义其他部分?在执行main()之前,内存设置会发生 在嵌入式环境中,构建工具(编译器、链接器等)通常会带来名为“crte”(C运行时环境)的代码文件,其中包含用于该环境的代码。可能只有在您与编译器制造商签订了特殊(昂贵)合同的情况下,否则他们可能不允许您了解这一点。 该代码将用0填充“bss”部分,用定义

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


除了
.bss
.data
之外,我们是否可以为全局变量定义其他部分?

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

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

如果您创建另一个分区,它将不会自动获得方便的服务。没有特别的预防措施。结果是在通电后恰好在内存中的值。这不是一个很好的随机数生成器,但是非常不可预测。这将符合您对“垃圾值”的描述

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

对于自己做这件事(可能是一种商业上不太理想的方法,即太冒险、太耗时),“只是”在第一次访问变量之前,确保执行一些将值写入节的代码。链接器可能将符号发布到编译器可见的标识符列表中,如“\uuuu链接器\u节\uuuu开始”和“\uuuu链接器\u节\uuu结束”。使用这些选项可以获得正确的内存地址。

在执行main()之前,内存设置将进行

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

如果您创建另一个分区,它将不会自动获得方便的服务。没有特别的预防措施。结果是在通电后恰好在内存中的值。这不是一个很好的随机数生成器,但是非常不可预测。这将符合您对“垃圾值”的描述

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


对于自己做这件事(可能是一种商业上不太理想的方法,即太冒险、太耗时),“只是”在第一次访问变量之前,确保执行一些将值写入节的代码。链接器可能将符号发布到编译器可见的标识符列表中,如“\uuuu链接器\u节\uuuu开始”和“\uuuu链接器\u节\uuu结束”。使用它们来获得正确的内存地址。

这取决于您的编译器,它应该是将该数据标记为.bss或.data的编译器,然后在链接器脚本中,您可能无法选择它们所在的部分,但您当然可以选择它们的位置,如果你开始搞乱它,你可能不得不搞乱将.data移动到ram(如果需要)和zeros.bss的引导程序。但同时,根据您的系统和链接器脚本,您可能也不必这样做(例如,基于ram的二进制文件,如raspberry pi,并且您将.bss放在gnu链接器的.data之前,您既不必移动.data,也不必将.bss归零,因为objcopy to binary会将其放在图像中)


您使用的是哪种编译器,可以将C定义的全局变量标记为.bss或.data以外的内容?你是如何做到这一点的呢?

这取决于你的编译器,它应该是一个将数据标记为.bss或.data的编译器,然后在你的链接器脚本中,你可能无法选择它们在哪个部分,但你当然可以选择它们去哪里,如果你开始搞乱它,你可能不得不搞乱将.data移动到ram(如果需要)和zeros.bss的引导程序。但同时,根据您的系统和链接器脚本,您可能也不必这样做(例如,基于ram的二进制文件,如raspberry pi,并且您将.bss放在gnu链接器的.data之前,您既不必移动.data,也不必将.bss归零,因为objcopy to binary会将其放在图像中)


您使用的是哪种编译器,可以将C定义的全局变量标记为.bss或.data以外的内容?您是如何做到这一点的?

C是否给您提供了这种选择?我们可以为全局变量定义除.bss或.data之外的其他部分吗?当然,只要你不需要初始化它。您可能需要将节放置在可写的段中:)与友好的邻里链接器交谈。对将发生的情况的简短回答是,当函数/程序启动时,您可能无法获得这些变量的预期值。没有“节”在C标准中。在程序启动时,代码库中的某个地方将有代码为.bss和.data分配初始值。如果你把变量放在ot中