Gnu Assembler (GAS) में CFI के निर्देश किसके लिए उपयोग किए जाते हैं?


118

हर पंक्ति के बाद एक .CFI निर्देश लगता है और इन पूर्व। .cfi_startproc, .cfi_endprocआदि की व्यापक विविधताएं हैंयहां और अधिक

    .file   "temp.c"
    .text
.globl main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    movq    %rsp, %rbp
    .cfi_offset 6, -16
    .cfi_def_cfa_register 6
    movl    $0, %eax
    leave
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
.globl func
    .type   func, @function
func:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    movq    %rsp, %rbp
    .cfi_offset 6, -16
    .cfi_def_cfa_register 6
    movl    %edi, -4(%rbp)
    movl    %esi, %eax
    movb    %al, -8(%rbp)
    leave
    ret
    .cfi_endproc
.LFE1:
    .size   func, .-func
    .ident  "GCC: (Ubuntu 4.4.1-4ubuntu9) 4.4.1"
    .section    .note.GNU-stack,"",@progbits

मुझे इनका उद्देश्य नहीं मिला।


3
यहाँ के cfiनिर्देशों का वर्णनGNU AS
पासचलिस

संबंधित: जीसीसी / क्लैंग असेंबली आउटपुट से "शोर" कैसे निकालें? , यदि आप निर्देशों के बिना निर्देश चाहते हैं। अच्छे तरीके से अपने कोड को gcc.godbolt.org पर डालना है ताकि विभिन्न कंपाइलरों के विभिन्न संस्करणों (गैर- x86 सहित) से अच्छे फ़िल्टर किए गए asm आउटपुट को देखने के लिए, asm ब्लॉक्स के साथ स्रोत लाइनों से मेल खाते हुए रंग पर प्रकाश डाला जा सके।
पीटर कॉर्ड्स

जवाबों:


70

मुझे यह महसूस हुआ है कि यह कॉल फ्रेम सूचना के लिए है और कॉल फ्रेम को प्रबंधित करने के लिए एक GNU AS एक्सटेंशन है। से डेवलपर :

कुछ आर्किटेक्चर पर, कॉल फ्रेम सूचना निर्देशों के साथ अपवाद हैंडलिंग को प्रबंधित किया जाना चाहिए। इन निर्देशों का उपयोग विधानसभा में अपवाद हैंडलिंग को निर्देशित करने के लिए किया जाता है। ये निर्देश लिनक्स पर पॉवर पर उपलब्ध हैं, यदि, किसी भी कारण से (कोड आधार की पोर्टेबिलिटी, उदाहरण के लिए), तो जीसीसी उत्पन्न अपवाद हैंडलिंग जानकारी पर्याप्त नहीं है।

ऐसा लगता है कि अपवाद हैंडलिंग की आवश्यकता के आधार पर ये कुछ प्लेटफार्मों पर उत्पन्न हुए हैं।

यदि आप इन्हें अक्षम करना चाहते हैं, तो कृपया डेविड का उत्तर देखें ।


5
आप इसके बारे में एक शब्द भी कह सकते हैं .LFB0, .LFB1, .LFE0, .LFE1
पंजे 12

@ क्लॉज़ - वे कंपाइलर-जनरेटेड लेबल हैं (जैसा कि आप देख सकते हैं :)। देखें stackoverflow.com/a/15285058/4294399
Calculuswhiz

144

इन्हें अक्षम करने के लिए, gcc विकल्प का उपयोग करें

-fno-asynchronous-unwind-tables

-fno-dwarf2-cfi-asm जरूरत भी हो सकती है।


12
-fno-dwarf2-cfi-asmजरूरत भी हो सकती है
टेक्नोकोरस

यदि आप इसे मानव-पठनीय एएसएम आउटपुट के लिए अक्षम कर रहे हैं, तो देखें कि जीसीसी / क्लैंग असेंबली आउटपुट से "शोर" कैसे निकालें? अन्य उपयोगी विकल्पों और ट्रिक्स के लिए।
पीटर कॉर्डेस

30

डिबगिंग के लिए CFI निर्देशों का उपयोग किया जाता है। यह डिबगर को ढेर को खोल देने की अनुमति देता है। उदाहरण के लिए: यदि प्रक्रिया A कॉल प्रक्रिया B कहती है, जो तब एक सामान्य प्रक्रिया C कहती है। प्रक्रिया C विफल हो जाती है। अब आप जानना चाहते हैं कि वास्तव में C किसे कहते हैं और फिर आप जानना चाह सकते हैं कि B को किसने बुलाया।

एक डिबगर स्टैक पॉइंटर (% rsp) का उपयोग करके इस स्टैक को खोल सकता है और% rbp को पंजीकृत कर सकता है, हालांकि यह जानना आवश्यक है कि उन्हें कैसे खोजना है। यही वह जगह है जहां सीएफआई के निर्देश आते हैं।

movq    %rsp, %rbp
.cfi_def_cfa_register 6

इसलिए यहां अंतिम पंक्ति यह बताती है कि "कॉल फ्रेम एड्रेस" अब रजिस्टर 6 में है (% rbp)


2
लेकिन मुझे लगता है कि डीएफआई की तुलना में सीएफआई के उपयोग को छोड़कर अपवाद को लगातार अधिक होना चाहिए।
असगंध

6
दरअसल CFA का अर्थ "कैनोनिकल फ्रेम एड्रेस" है। देखें यहाँ
कैमरून


1
सीएफआई निर्देश -fomit-frame-pointerआरबीपी (जो कि जीसीसी या क्लैंग -O1और उच्चतर के साथ डिफ़ॉल्ट रूप से चालू है ) के विकल्प के रूप में संकलित कोड के लिए भी स्टैक-अनइंडिंग की अनुमति देता है । इसका उपयोग C ++ अपवाद हैंडलिंग के साथ-साथ डीबगर / प्रोफाइलर द्वारा किया जाता है। पारंपरिक आरबीपी फ्रेम पॉइंटर्स के साथ कोड में , वर्तमान आरबीपी मान हमेशा एक सहेजे गए आरबीपी मूल्य पर इंगित करता है, और जो पिछले एक लिंक किए गए सूची को बनाता है। उस मामले में CFI की कोई आवश्यकता नहीं है। (हालांकि एक फ्रेम पॉइंटर का उपयोग करने वाले कार्यों में, CFI cfa_register प्रत्येक RSP परिवर्तन के लिए अधिक मेटाडेटा की आवश्यकता से बचा जाता है, जैसे आप दिखा रहे हैं।)
पीटर कॉर्ड्स

2

इन्हें निष्क्रिय करने के लिए, g ++ -fno-exceptionsको पहले बताए गए साथ की जरूरत है -fno-asynchronous-unwind-tables, बशर्ते कि आप अपवादों का उपयोग न करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.