的說明我想要解釋一下GCC生成的彙編中使用的.cfi_def_cfa_offset指令的值。我隱約知道.cfi指令涉及到調用幀和堆棧展開,但我想要更詳細地解釋爲什麼,例如,在GCC輸出的程序集中使用值16和8編譯以下C程序在我的64位Ubuntu機器上。GAS:.cfi_def_cfa_offset
C程序:
#include <stdio.h>
int main(int argc, char** argv)
{
printf("%d", 0);
return 0;
}
我調用GCC上的源文件test.c的如下:gcc -S -O3 test.c
。我知道-O3支持非標準優化,但爲了簡潔起見,我想限制生成的程序集的大小。
生成的組件:
.file "test.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB22:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
xorl %edx, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE22:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
.section .note.GNU-stack,"",@progbits
爲什麼是用於在生成的組件中的.cfi_def_cfa_offset指令值16和8?此外,爲什麼用於本地功能的數字22開始和功能結束標籤?
確實很好的解釋。通常標籤是按順序編號的(關於函數範圍),在這裏我們可能只會看到那些,因爲優化器刪除了其他標籤。 – JohnTortugo
非常感謝你給出了非常明確的解釋! – namanhams
要了解.cfi_ *指令,您還應該查看https://sourceware.org/binutils/docs/as/CFI-directives.html。它很薄,但它是官方的。 –