का स्पष्टीकरण मुझे जीसीसी द्वारा उत्पन्न असेंबली में .cfi_def_cfa_offset निर्देशों के साथ उपयोग किए गए मानों के लिए स्पष्टीकरण चाहिए। मुझे पता है कि .cfi निर्देश कॉल फ्रेम में शामिल हैं और अवांछित ढेर हैं, लेकिन मुझे एक और विस्तृत स्पष्टीकरण चाहिए कि क्यों, उदाहरण के लिए, निम्नलिखित सी प्रोग्राम को संकलित करने में जीसीसी द्वारा प्रदत्त असेंबली में मान 16 और 8 का उपयोग किया जाता है मेरी 64-बिट उबंटू मशीन पर।जीएएस: .cfi_def_cfa_offset
सी कार्यक्रम: gcc -S -O3 test.c
:
#include <stdio.h>
int main(int argc, char** argv)
{
printf("%d", 0);
return 0;
}
मैं इस प्रकार स्रोत फ़ाइल 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
मान 16 और 8 उत्पन्न विधानसभा में .cfi_def_cfa_offset निर्देशों के लिए इस्तेमाल क्यों कर रहे हैं? साथ ही, स्थानीय फ़ंक्शन के लिए उपयोग की जाने वाली संख्या 22 क्यों शुरू होती है और अंतिम लेबल काम करती है?
वास्तव में बहुत अच्छी व्याख्या। आम तौर पर लेबल क्रमशः क्रमांकित होते हैं (फ़ंक्शन स्कोप के संबंध में), यहां हम केवल उनको देख सकते हैं क्योंकि ऑप्टिमाइज़र ने अन्य लेबल हटा दिए हैं। – JohnTortugo
एक बहुत स्पष्ट स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! – namanhams
.cfi_ * निर्देशों को समझने के लिए, आपको https://sourceware.org/binutils/docs/as/CFI-directives.html भी देखना चाहिए। यह पतला है, लेकिन यह आधिकारिक है। –