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 处启用错误标志的主要内容,如果未能解决你的问题,请参考以下文章

g++ 标志的含义 -Wall -W -Werror

如何在 Xcode 中启用 Neon 指令

Makefile 中隐式规则中的 -c 标志错误

启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误

再谈Vim substitute替换命令

Mac 上的 G++ 链接时优化 - 编译器/链接器错误?