我在Linux 14.04 x64上使用g ++ 4.8.4。我在编译和链接期间使用-O3和-flto标记编译我的项目,即我的Makefile中的CFLAGS和LDFLAGS都有这些选项。
我刚刚发现,当涉及到float / double的计算时,优化的二进制文件表现不同(即错误地)。仅从LDFLAGS中删除-O3似乎正在解决问题。
我记得在某处读过,通常可以安全地为编译器和链接器指定相同的优化标志集。我理解错了吗?提前谢谢。
答案 0 :(得分:1)
使用LTO时,编译期间的编译器会将中间代码表示(a.k.a. GIMPLE)转储到目标文件的特殊部分。
在链接阶段实际编译到机器代码和优化。
所以,是的,如果您的代码导致UB或仅使用-O3选项进行了错误优化,如果您将其更改为-O0,-Og等,则其行为可能会有所不同(如预期)
所以你必须弄清楚是你的代码行为不端,还是实际的GCC LTO错误