我正在尝试诊断问题.问题是如果我在程序的开头放置printf(特别是printf),我的程序工作正常,如果我不这样做则不行.这个问题非常特定于一个循环,它读取我在systick_handler中递增的systick变量.
如果我用-fno-common编译,那么一切正常.为什么会这样?
此外,我已从我的链接器脚本中删除了.COMMON部分,因为它们使程序几乎增加了两倍.无论如何,一切都在没有它们的情况下运行良好,但我怀疑当我使用默认(-fcommon)标志进行编译时,它们的缺失会以某种方式导致无限循环.我仍然看不到我文件中的.COMMON部分的引用.它必须来自libc.
谁能解释一下发生了什么?
当你使用-fno-common时,未初始化的全局变量被放置在.bss部分(哦,虽然手册说的数据)由GCC.如果不使用该选项,则将它们放在名为COMMON的特殊部分中.
如果从链接描述文件中省略此部分,链接器只会将其放入RAM,可能与其他数据重叠.您可以在地图文件中查看它.我只是尝试使用我的链接器脚本,发现COMMON的内容与我的情况下的堆放在同一个内存区域.这意味着全局变量和使用例如malloc分配的任何内容都将相互覆盖.不要那样做.坏事会发生.
关于使用-fno-common和忽略COMMON的安全性:我假设库也可以包含COMMON.即使您的代码不包含此部分,因为您使用-fno-common并不意味着链接器不需要处理它.只需在*(.bss)旁边添加*(COMMON)就可以了.如果由此增加内存消耗,则有充分的理由.
进一步阅读:
| 归档时间: |
|
| 查看次数: |
2168 次 |
| 最近记录: |