GCC 4.8:-Og暗示-g?

csc*_*wan 18 gcc

最近更新了GCC 4.8的文档,现在引入了一个新的优化开关-Og.这个

[..]解决了快速编译和卓越调试体验的需求,同时提供了合理的运行时性能.总体开发经验应优于默认优化级别-O0.

此切换是否暗示-g或我是否必须CXXFLAGS手动将其添加到我的手中?

Lek*_*eyn 27

看一下GCC 4.9.2源代码(gcc/opts.c)显示它-Og是相同的-O1,但是禁用了一些标志会导致更糟糕的调试体验:

/* in function default_options_optimization: */
    case OPT_Og:
      /* -Og selects optimization level 1.  */
      opts->x_optimize_size = 0;
      opts->x_optimize = 1;
      opts->x_optimize_fast = 0;
      opts->x_optimize_debug = 1;
      break;
Run Code Online (Sandbox Code Playgroud)

几步之后,maybe_default_option使用一组选项和x_optimize_debug标志调用函数.标有选项OPT_LEVELS_1_PLUS_NOT_DEBUG,OPT_LEVELS_1_PLUS_SPEED_ONLY而OPT_LEVELS_2_PLUS_SPEED_ONLY当将不被启用-Og时使用.

所以这就是声明"应该比-O0更好"的地方.-Og介于-O0和之间-O1.这不会影响包含将通过-g选项启用的调试信息.您可能也会对不同的-g选项感兴趣:

  • 选项-ggdb覆盖-g.也就是说,如果您-ggdb在之后设置-g,则-g有效地忽略该选项.
  • 选项-g等于-g2和省略-g是相同的-g0.
  • 选项-g3产生比较大的调试部分-g2也是如此-ggdb3抵抗-ggdb2.
  • 更高的优化级别都会导致代码和调试部分的增加.(-O0< -O1< -Og< -O2< -O3).
  • strip --strip-debug导致相同的对象大小独立于-g级别.这符合预期,即只有-O级别对-g确定调试部分的实际代码有影响.
  • strip --keep-debug导致对象的大小由-g关卡控制,其次是-O关卡.(所以-g0 -O3小于-g3 -O0).

注意:这里我没有考虑编译的时间.随着更积极的优化级别,它可能会增加.我希望调试级别只会对时间产生轻微影响(与优化相比),因为它只是意味着需要在传递过程中跟踪额外的细节.

这是我用来测试实际行为的命令(也比较-ggdbX而不是-gX):

for g in -g0 -g2 -g3;do
    for O in -O0 -O1 -O2 -O3 -Og; do
        flags="$g $O";
        gcc -fPIC -rdynamic -c -Wall -Wextra -Ilib ltunify.c -o obj/gL_"${flags// /_}_.o" $flags || break;
    done;
done
Run Code Online (Sandbox Code Playgroud)


pat*_*cek 17

简答:不,你还必须-g手动添加.

答案很长:

我一直在努力寻找源代码的硬答案,所以我决定使用这里描述的方法自己测试:如何检查程序是否使用调试符号编译?

我用-O3旗帜构建了一个可执行文件而没有-g.objdump --syms <file> | grep debug正如所料,使用没有产生任何结果.

然后我构建了一个带有-g和不带任何优化标志的可执行文 同样的objdump命令产生了六个结果,例如:

0000000000000000 l d .debug_info 0000000000000000 .debug_info

我终于用-Og旗帜构建了一个可执行文件而没有-g.这objdump命令什么都没产生.这意味着在这种情况下不存在调试符号.

虽然我找不到GCC本身的任何明确的文档,但是Gentoo Wiki(正如Marco Scannadinari之前提到的那样)证实了我的断言-Og并不意味着-g.