Gdb:gcc-O0组合示例

Gdb:gcc-O0组合示例,gcc,assembly,gdb,Gcc,Assembly,Gdb,希望这不是一个愚蠢的问题 编译时没有指定优化: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 0x00000

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

编译时没有指定优化: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   
。。。
整数和(整数x,整数y)
{
整数和=x+y;
回报金额;
}
...
0x00000000004004ed:推送%rbp
0x000000000004004EE:mov%rsp,%rbp
0x0000000000404F1:mov%edi,-0x14(%rbp)
0x00000000004004f4:mov%esi,-0x18(%rbp)
0x00000000004004f7:mov-0x18(%rbp),%eax
0x0000000000404FA:mov-0x14(%rbp),%edx
0x00000000004004fd:添加%edx,%eax
0x00000000004004ff:mov%eax,-0x4(%rbp)
0x0000000000400502:mov-0x4(%rbp),%eax
0x0000000000400505:弹出%rbp
0x0000000000400506:retq

关闭优化后,源代码和机器代码之间有一个1:1的表示形式,允许更轻松的调试。启用优化后,编译器可以执行一些奇怪的操作,如重新排列代码或删除使调试代码更加困难的变量


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

关闭优化后,源代码和机器代码之间有一个1:1的表示形式,允许更容易的调试。启用优化后,编译器可以执行一些奇怪的操作,如重新排列代码或删除使调试代码更加困难的变量


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

它更直接地映射到源代码。一些安全关键应用程序,如汽车、飞机或医疗,etc可能要求他们不要优化,因为很难验证编译器输出是否与源输入正确匹配。这是一个移动的目标,在没有优化的情况下,理想情况下,工具链可以被验证,或者相对容易,或者二进制文件中有更高的舒适度。此外,没有优化,您可以通过删除优化死代码的代码进行调试、单步等,一些代码可能会被重新安排,高级和输出之间没有一对一的关系,因此您不必单步执行,也不必查看内存或变量等。它更直接地映射到源代码。一些安全关键应用程序,如汽车、飞机或医疗,etc可能要求他们不要优化,因为很难验证编译器输出是否与源输入正确匹配。这是一个移动的目标,在没有优化的情况下,理想情况下,工具链可以被验证,或者相对容易,或者二进制文件中有更高的舒适度。此外,没有优化,您可以通过删除优化死代码的代码进行调试、单步等,一些代码可能会被重新安排,在高电平和输出之间没有一对一的关系,所以你不必分步,也不必观察内存或变量等。