g++ 在 -Os 处启用错误标志
Posted
技术标签:
【中文标题】g++ 在 -Os 处启用错误标志【英文标题】:g++ enables wrong flags at -Os 【发布时间】:2014-12-20 18:06:54 【问题描述】:目前我正在使用 GNU C++-Compiler 和 -Os 优化选项进行一些实验,以减少代码大小。我使用以下命令检查了 -Os 处启用的编译器标志:
g++ -c -Q -Os --help=optimizers | grep "enabled"
我得到了启用选项的列表:
-faggressive-loop-optimizations [enabled]
-falign-functions [enabled]
-falign-jumps [enabled]
-falign-labels [enabled]
-falign-loops [enabled]
-fasynchronous-unwind-tables [enabled]
...
这似乎有点奇怪,因为我也查了一下,哪些标志应该在 -Os、here 处启用,并且在 -Os 部分下写着应该禁用所有 falign-
选项以最小化代码。
问:这是一个错误还是我在这里做错了什么?因为在阅读了falign-
标志后,我真的认为它们应该在 -Os 中禁用!
我的 gcc 版本是 4.9.2,我正在使用 Arch-Linux。
已经感谢您的帮助:)
【问题讨论】:
我可以用相同的编译器重现,也可以用旧的 4.4.7 重现,除了那里缺少falign-loops
。
gcc.gnu.org/bugzilla/show_bug.cgi?id=43861
啊,谢谢,所以这似乎是一个已知的错误。我会尝试使用 bugzilla 的补丁或明确禁用这些选项。
好找汉斯。我打算建议 Trezz 提交一份错误报告。
【参考方案1】:
问:这是一个错误还是我在这里做错了什么?因为在阅读了 falign-flags 之后,我真的认为它们应该在 -Os 中禁用
我认为汉斯在找到问题的一部分方面做得很好。它绝对是一个文档错误。但是 GCC 没有人评论为什么 -Os
启用它们,所以你可能没有所有的信息。
较旧的 ARM 设备非常不能容忍未对齐的访问。较旧的 arm 设备包括 ARMv4,我认为是 ARMv5。如果您执行了未对齐的访问,您将获得SIGBUS
(去过那里,完成了,得到了 T 恤)。
现代 ARM 设备像 x86 处理器一样修复了未对齐的访问,因此您不再获得SIGBUS
。相反,您只需承担性能损失。
您应该尝试指定体系结构,以防这些选项是旧 ARM 设备支持的产物。例如,-march=armv7
。如果您在 ARMv6 和 ARMv7 上找到它,那么这仍然可能是一个错误。这取决于 GCC 团队是否认为这种折衷对于 ARM 来说是足够的(代码大小与性能损失)。
【讨论】:
以上是关于g++ 在 -Os 处启用错误标志的主要内容,如果未能解决你的问题,请参考以下文章
启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误