GCC:为什么-fno-omit-frame-pointer和优化标志没有区别

问题描述

省略帧指针确实会使调试变得非常困难。如果没有帧指针来帮助,局部变量将更难定位,堆栈跟踪也将难以重构。另外,由于参数距离堆栈的顶部很远,因此访问参数可能会变得更加昂贵,并且可能需要更昂贵的寻址模式。

因此,-fno-omit-frame-pointer选项指导编译器生成可维护并使用所有功能的堆栈框架指针的代码,以便调试器即使具有优化标志也仍可产生堆栈回溯。

所以我很好奇为什么将-fno-omit-frame-pointer与GCC的优化标志一起使用时没有区别。

我用于测试的代码

int f() {
  return 42;
}

使用Clang的区别:

$ diff <(clang -S test.c -Os -fno-omit-frame-pointer -o -) <(clang -S test.c -Os -o -)
8,12d7
<       pushq   %rbp
<       .cfi_def_cfa_offset 16
<       .cfi_offset %rbp,-16
<       movq    %rsp,%rbp
<       .cfi_def_cfa_register %rbp
14,15d8
<       popq    %rbp
<       .cfi_def_cfa %rsp,8

但是使用GCC并没有区别:

$ diff <(gcc -S test.c -Os -fno-omit-frame-pointer -o -) <(gcc -S test.c -Os -o -) | wc -l
0

当然,我也使用-g进行了测试。也没有区别。

我用于测试的规格:

  • cpu:英特尔(R)至强(R)cpu E5-2628L v3
  • C语: 12.0.0
  • 海湾合作委员会: 9.3.0
  • 操作系统: Ubuntu 20.04

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)