Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc ARM、.公共部分和-fno公共标志_Gcc_Linker_Arm_Ld - Fatal编程技术网

Gcc ARM、.公共部分和-fno公共标志

Gcc ARM、.公共部分和-fno公共标志,gcc,linker,arm,ld,Gcc,Linker,Arm,Ld,我在试着诊断一个问题。问题是如果我在程序的开头放一个printf(特别是printf),我的程序就可以正常工作,如果我不放,它就不能正常工作。这个问题非常特定于一个循环,该循环读取我在systick_处理程序中递增的systick变量 但是,如果我使用-fno-common编译,那么一切都正常。为什么会有这种行为 此外,我已经从我的链接器脚本中删除了.COMMON部分,因为它们使程序的大小几乎增加了一倍。不管怎样,没有它们,一切都运行得很好,但我怀疑它们的缺失是在我使用default(-fcom

我在试着诊断一个问题。问题是如果我在程序的开头放一个printf(特别是printf),我的程序就可以正常工作,如果我不放,它就不能正常工作。这个问题非常特定于一个循环,该循环读取我在systick_处理程序中递增的systick变量

但是,如果我使用-fno-common编译,那么一切都正常。为什么会有这种行为

此外,我已经从我的链接器脚本中删除了.COMMON部分,因为它们使程序的大小几乎增加了一倍。不管怎样,没有它们,一切都运行得很好,但我怀疑它们的缺失是在我使用default(-fcomon)标志编译时导致无限循环的原因。但在我的文件中仍然没有看到对.COMMON部分的引用。一定是libc发来的


有人能解释发生了什么事吗

当您使用-fno common时,GCC会将未初始化的全局变量放在.bss部分(哦,尽管手册上说是数据)。如果不使用该选项,则会将它们放置在名为“公用”的特殊部分中

如果您从链接器脚本中省略了这个部分,那么链接器只会将其放入RAM中,可能与其他数据重叠。您可以在地图文件中检查它。我只是用我的链接器脚本尝试了一下,发现COMMON的内容与我的例子中的堆放在同一个内存区域。这意味着全局变量和分配的任何内容(例如malloc)将相互覆盖。不要那样做。坏事会发生的

关于使用-fno-common和忽略common的安全性:我假设库也可以包含common。即使您的代码不包含此部分,因为您使用了-fno common,但这并不意味着链接器不需要处理它。只需在*(.bss)旁边添加*(通用),您就安全了。如果内存消耗因此而增加,这是有充分理由的

进一步阅读:


我无法提供,因为我不太确定问题出在哪里。我认为它在libc的某个地方,因为我根本没有使用.common部分。我通过使用-fno-common编译解决了这个问题,因为我首先省略了.common部分。但我不确定这是否会在将来导致一些未知的问题,或者-fno-common是否永久解决了这个问题。不幸的是,我无法访问出现问题的平台上的硬件调试界面。请生成一个映射文件并查看放置在“.COMMON”中的内容。我不确定我观察到了什么,但Valgrind在尝试在Apple平台上测试时点亮了圣诞树。苹果要么(1)将一些初始化的全局变量放在公共位置,要么(2)对它们所在的部分执行延迟初始化。我能阻止Valgrind发现的唯一方法是在问题变量上添加
\uuuu属性((节(“nocommon”))
。我们可能应该在命令行中添加
-fno common