【问题标题】:Gdb: gcc -O0 assmbly exmplegdb:gcc -O0 汇编示例
【发布时间】:2017-03-28 16:10:30
【问题描述】:

希望不是一个愚蠢的问题。

编译时未指定优化:gcc test.c -o test(似乎选择了-O0)。

gcc -O2 或 -O3 输出的汇编代码比 -O0 更清晰(至少在我看来)。

-O0的原因是什么,它对我们有什么帮助,我看不出它比-O1或-O2简单。

...
int sum(int x, int y)
{
    int sum = x + y;
    return sum;
}
...

0x00000000004004ed <+0>:     push   %rbp
0x00000000004004ee <+1>:     mov    %rsp,%rbp
0x00000000004004f1 <+4>:      mov    %edi,-0x14(%rbp)
0x00000000004004f4 <+7>:      mov    %esi,-0x18(%rbp)
0x00000000004004f7 <+10>:    mov    -0x18(%rbp),%eax
0x00000000004004fa <+13>:    mov    -0x14(%rbp),%edx
0x00000000004004fd <+16>:    add    %edx,%eax
0x00000000004004ff <+18>:     mov    %eax,-0x4(%rbp)
0x0000000000400502 <+21>:   mov    -0x4(%rbp),%eax
0x0000000000400505 <+24>:   pop    %rbp
0x0000000000400506 <+25>:   retq   

【问题讨论】:

  • 它更直接地映射到源代码。
  • 一些安全关键应用程序,如汽车、飞机或医疗等,可能会要求他们不需要优化,因为很难验证编译器输出是否与源输入正确匹配。它是一个移动的目标,如果没有优化,理想情况下,可以验证工具链,或者相对更容易,或者二进制文件中有更多的舒适度。
  • 同样不用优化也可以通过去掉优化死代码的代码进行调试、单步等,部分代码可能会重新排列,高层和底层没有一一对应的关系输出,所以你不一定要步进,你不一定要查看内存或变量等。

标签: gcc assembly gdb


【解决方案1】:

在关闭优化的情况下,源代码和机器代码之间存在 1:1 的表示,从而更容易调试。启用优化后,编译器可以做一些奇怪的事情,例如重新排列代码或删除使代码调试更加困难的变量。

使用-O0 进行编译通常也更快,因为优化器通常是每个现代编译器中最慢的组件。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多