assembly - Why GCC compiled C program needs .eh_frame section? -


टेस्ट 32 बिट x86 लिनक्स पर जीसीसी 4.6.3

पर है सी प्रोग्राम को संकलित करने के लिए जीसीसी का उपयोग करते समय और अनुभाग जानकारी को देखने के लिए readelf का उपयोग करते हुए, मैं .eh_frame अनुभाग और .eh_frame_hdr अंदर अनुभाग।

उदाहरण के लिए, यहां द्विआधारी प्रोग्राम Perlbench का अनुभाग जानकारी है।

 < Code> readelf -S perlbench ओफ़्सेट 0x102e48 से शुरू होने वाले 28 अनुभाग हेडर हैं: अनुभाग शीर्षकों: [एनआर] नाम प्रकार शख्सियत बंद आकार ईएसए फ्लैग एलके इंफ अल [0] शून्य 00000000 000000 000000 00 0 0 0 [1] .interp PROGBITS 08048154 000154 000013 00 ए 0 0 1 [2]। नोट। एबीआई-टैग नोट 08048168 000168 000020 00 ए 0 4 4 [3] .note.gnu.build-i नोट 08048188 000188 000024 00 ए 0 4 4 [4]। gnu.hash GNU_HASH 080481ac 0001ac 000,044 04 ए 5 0 4 [5] .dynsym DYNSYM 080481f0 0001f0 0007b0 10 ए 6 1 से 4 [6] .dynstr STRTAB 080489a0 0009a0 0003d6 00 ए 0 0 1 [7] .gnu.version VERSYM 08048d76 000d760000f6 02 5 0 2 [8] .gnu.version_r VERNEED 08048e6c 000e6c 0000a0 00 एक 6 2 से 4 [9] .rel.dyn REL 08048f0c 000f0c 000,028 08 ए 5 0 4 [10] .rel.plt REL 08048f34 000f34 000,388 08 एक 5 से 12 4 [11] .init PROGBITS 080492bc 0012bc 00002e 00 कुल्हाड़ी 0 0 4 [12] .plt PROGBITS 080492f0 0012f0 000,720 04 कुल्हाड़ी 0 0 16 [13] .text PROGBITS 08049a10 001a10 0cf86c 00 कुल्हाड़ी 0 0 16 [14]। फाइन प्रोग्रेट्स 0811927c 0d127c 00001a 00 एक्स 0 0 4 [15] .Rodata PROGBITS 081192a0 0d12a0 017960 00 ए 0 0 32 [16] .eh_frame_hdr PROGITS 08130c00 0e8c00 003604 00 ए 0 0 4 [17] .eh_frame PROGITS 08134204 0ec204 01377 सी 00 ए 0 0 4 [18] .कैक्टर प्रोबिट्स 08148 एफ 0 सी 0 एफएफ 0 सी 000008 00 वा ए 0 0 4 [1 9]। डीटीओर्स प्रोग्बिट्स 08148 एफ 14 0 एफएफ 14 000008 00 वा ए 0 0 4 [20]। जेसीआर प्रोजीबिट्स 08148 एफ 1 सी 0 एफएफ 1 सी 000004 00 डब्ल्यूए 0 4 4 [21]। गतिशील गतिशील 08148f20 0fff20 0000d0 08 वाशिंगटन 6 0 4 [22] .got PROGBITS 08148ff0 0ffff0 000004 04 वाशिंगटन 0 0 4 [23] .got.plt PROGBITS 08148ff4 0ffff4 0001d0 04 वाशिंगटन 0 0 4 [24] .data PROGBITS 081491e0 1001e0 002b50 00 वाशिंगटन 0 0 32 [25]। बीबीएस नोबिट्स 0814bd40 102d30 002b60 00 WA 0 0 32 [26] .comment 00000000 102d30 00002a 01 एमएस 0 0 1 [27] .shstrtab STRTAB 00000000 102d5a 0000ec 00 0 0 1   

मेरी समझ में, ये अपवादों को संभालने के लिए दो वर्गों का उपयोग किया जाता है, यह तालिकाओं का उत्पादन करता है जो बताता है कि कैसे ढेर को खोलना है।

लेकिन यह C ++ प्रोग्राम के लिए है, वे eh_frame और gcc_exception_table वर्ग अपवादों का प्रबंधन करने के लिए, फिर क्यों कंपाइलर eh_frame और eh_frame_hdr अंदर स्थित ELF से संकलित करता है < कोड> सी प्रोग्राम?

सबसे पहले, इसके लिए मूल कारण काफी हद तक राजनीतिक था - जिन लोगों ने डीडब्ल्यूएआरएफ़-आधारित अनियॉइडिंग ( .eh_frame ) को जोड़ा था, वे एक ऐसी सुविधा बनना चाहती थीं जो हमेशा वहां मौजूद होती है, इसका उपयोग केवल सी ++ अपवादों के अलावा अन्य सभी प्रकार के सामान को लागू करने के लिए किया जा सकता है:

  • बैकटास ()
  • __ विशेषता __ ((__ कोला Nup __ (f))
  • __ अंतर्निहित_ वापसी (n) , n & gt; 0
  • इन चीजों में से किसी की ज़रूरत नहीं है, .eh_frame कुछ लाभ के साथ 15 से 30% वृद्धि की तरह .text आकार में है आप व्यक्तिगत अनुवाद इकाइयों के लिए .h_frame को -fno-asynchronous-unwind-tables के साथ पीढ़ी को अक्षम कर सकते हैं, और यह आमतौर पर आकार की लागत को समाप्त कर देता है, हालांकि आपके पास अभी कुछ शेष crtbegin.o , आदि से आने पर आप नहीं कर सकते उन्हें strip कमांड के साथ बाद में पट्टी कर दें; चूंकि .eh_frame एक ऐसा कार्यक्रम है जो कार्यक्रम के लोड किए गए भाग में रहता है (यह संपूर्ण मुद्दा है), यह छीनने के तरीके को बाइनरी में बदलता है जो रनटाइम पर इसे तोड़ते हैं कैसे चीजें टूट सकती हैं इसका उदाहरण देखें।

    ध्यान दें कि डीडब्ल्यूएआरएएफएफ तालिकाओं का उपयोग डीबगिंग के लिए भी किया जाता है, लेकिन इस उद्देश्य के लिए उन्हें कार्यक्रम के लोड होने योग्य भाग में रहने की जरूरत नहीं है। -fno-asynchronous-unwind-tables का उपयोग करना डीबगिंग को नहीं तोड़ देगा, क्योंकि जब तक -g कंपाइलर को भी पारित किया जाता है, टेबल अब भी उत्पन्न हो जाते हैं; वे सिर्फ बाइनरी के एक अलग, गैर-लोड करने योग्य, पट्टीदार अनुभाग में संग्रहीत हो जाते हैं, .debug_frame

Comments

Popular posts from this blog

java - ImportError: No module named py4j.java_gateway -

python - Receiving "KeyError" after decoding json result from url -

.net - Creating a new Queue Manager and Queue in Websphere MQ (using C#) -