Gcc ARM、.公共部分和-fno公共标志
我在试着诊断一个问题。问题是如果我在程序的开头放一个printf(特别是printf),我的程序就可以正常工作,如果我不放,它就不能正常工作。这个问题非常特定于一个循环,该循环读取我在systick_处理程序中递增的systick变量 但是,如果我使用-fno-common编译,那么一切都正常。为什么会有这种行为 此外,我已经从我的链接器脚本中删除了.COMMON部分,因为它们使程序的大小几乎增加了一倍。不管怎样,没有它们,一切都运行得很好,但我怀疑它们的缺失是在我使用default(-fcomon)标志编译时导致无限循环的原因。但在我的文件中仍然没有看到对.COMMON部分的引用。一定是libc发来的Gcc ARM、.公共部分和-fno公共标志,gcc,linker,arm,ld,Gcc,Linker,Arm,Ld,我在试着诊断一个问题。问题是如果我在程序的开头放一个printf(特别是printf),我的程序就可以正常工作,如果我不放,它就不能正常工作。这个问题非常特定于一个循环,该循环读取我在systick_处理程序中递增的systick变量 但是,如果我使用-fno-common编译,那么一切都正常。为什么会有这种行为 此外,我已经从我的链接器脚本中删除了.COMMON部分,因为它们使程序的大小几乎增加了一倍。不管怎样,没有它们,一切都运行得很好,但我怀疑它们的缺失是在我使用default(-fcom
有人能解释发生了什么事吗 当您使用-fno common时,GCC会将未初始化的全局变量放在.bss部分(哦,尽管手册上说是数据)。如果不使用该选项,则会将它们放置在名为“公用”的特殊部分中 如果您从链接器脚本中省略了这个部分,那么链接器只会将其放入RAM中,可能与其他数据重叠。您可以在地图文件中检查它。我只是用我的链接器脚本尝试了一下,发现COMMON的内容与我的例子中的堆放在同一个内存区域。这意味着全局变量和分配的任何内容(例如malloc)将相互覆盖。不要那样做。坏事会发生的 关于使用-fno-common和忽略common的安全性:我假设库也可以包含common。即使您的代码不包含此部分,因为您使用了-fno common,但这并不意味着链接器不需要处理它。只需在*(.bss)旁边添加*(通用),您就安全了。如果内存消耗因此而增加,这是有充分理由的 进一步阅读:
\uuuu属性((节(“nocommon”))
。我们可能应该在命令行中添加-fno common
。