gpt4 book ai didi

gcc - 了解 gcc -S 输出

转载 作者:行者123 更新时间:2023-12-03 02:14:01 27 4
gpt4 key购买 nike

我在 x86_64 上对下面非常复杂的程序执行了 gcc -S:

int main() {
int x = 3;
x = 5;
return 0;
}

我得到的是:

       .file   "main.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $3, -4(%rbp)
movl $5, -4(%rbp)
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)"
.section .note.GNU-stack,"",@progbits

我想知道是否有人可以帮助我理解输出或向我推荐一些解释的链接。具体来说,cfi、LFB0、LFE0、leave 是什么意思?我所能找到的关于这些的是 this post但无法完全理解它的用途。另外,在这种情况下 ret 会做什么?我猜它会返回到 __libc_start_main() ,而后者又会调用 do_exit() ,这是正确的吗?

最佳答案

这些.cfsomething指令会导致编译器生成额外的数据。当指令引发异常时,此数据有助于遍历调用堆栈,以便可以找到并正确执行异常处理程序(如果有)。调用堆栈信息对于调试很有用。该数据很可能进入可执行文件的单独部分。它不会插入代码的指令之间。

.LFsomething: 只是常规标签,可能由额外的异常相关数据引用。

leaveret是CPU指令。

离开相当于:

movq    %rbp, %rsp
popq %rbp

并且它撤销了这两条指令的效果

pushq   %rbp
movq %rsp, %rbp

以及通过从rsp中减去某些内容来分配堆栈空间的指令。

ret 从函数返回。它从堆栈中弹出返回地址并跳转到该地址。如果是 __libc_start_main() 调用了 main(),那么它会返回那里。

关于gcc - 了解 gcc -S 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15284947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com