2012-06-25 16 views
11

किसी वस्तु फ़ाइल पर objdump के इस उत्पादन नहीं है:झंडे

$ objdump -h main.o 

main.o:  file format elf32-i386 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .text   0000000b 00000000 00000000 00000034 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    1 .data   00000000 00000000 00000000 00000040 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
    2 .bss   00000000 00000000 00000000 00000040 2**2 
        ALLOC 
    3 .note.GNU-stack 00000000 00000000 00000000 00000040 2**0 
        CONTENTS, READONLY, CODE 

क्या इन झंडे सामग्री, alloc, लोड और इतने पर मतलब है?

उत्तर

20

आप देख क्या वस्तु फ़ाइल में प्रत्येक अनुभाग के लिए ELF खंड झंडे, खंड प्रकार और अनुभाग झंडे के संयोजन की व्याख्या है मदद करता है।

  • LOAD मतलब यह है कि खंड, किसी लोड करने योग्य क्षेत्र में रहता है यानी इसकी सामग्री स्मृति में फ़ाइल से पढ़ा जा सकता है जब एक प्रक्रिया

धारा झंडे अच्छी तरह से प्रणाली के Chapter 4 में दर्ज कर रहे हैं बनाई गई है वी अनुप्रयोग बाइनरी इंटरफ़ेस, हालांकि objdump से कुछ अलग नामों के तहत दिखाता है।

  • CODE का अर्थ है कि अनुभाग में निष्पादन योग्य कोड है; यह अनुभाग शीर्ष लेख
  • DATA में SHF_EXECINSTR ध्वज से निर्देशित होता है इसका मतलब है कि खंड निष्पादन योग्य नहीं है, लेकिन लिखने योग्य है, SHF_WRITE झंडा
  • READONLY की उपस्थिति ने संकेत का मतलब है कि खंड न निष्पादन योग्य है और न ही writtable है और होना चाहिए केवल पढ़ने के लिए मेमोरी पेज
  • ALLOC का अर्थ है कि अनुभाग स्मृति पर है, उदाहरण के लिए मेमोरी पेज वास्तव में एक प्रक्रिया बनाई जाने पर अनुभाग सामग्री को पकड़ने के लिए आवंटित किए जाते हैं, SHF_ALLOC ध्वज द्वारा इंगित किया गया है। कुछ खंड, उदा। डीबग जानकारी वाले, सामान्य प्रोग्राम निष्पादन के दौरान स्मृति में नहीं पढ़े जाते हैं और स्मृति को बचाने के लिए ALLOC के रूप में चिह्नित नहीं किए जाते हैं।

प्रकार SHT_PROGBITS के अनुभाग में फ़ाइल में संबंधित सामग्री है और CONTENTS के रूप में दिखाया गया है। कुछ खंडों में फ़ाइल में संबंधित सामग्री नहीं है, उदा। .bss अनुभाग, जो SHT_NOBITS प्रकार का है।

.text अनुभाग में प्रोग्राम निष्पादन योग्य कोड शामिल है। यह CONTENTS के रूप में दिखाया गया है क्योंकि यह SHT_PROGBITS प्रकार है। मेमोरी को इस सेक्शन के लिए आरक्षित किया जाना चाहिए क्योंकि यह ALLOC है और इसकी सामग्री फ़ाइल से लोड की जानी चाहिए क्योंकि इसे LOAD -able सेगमेंट में रखा गया है। कार्यक्रम कोड आम तौर पर गैर-संशोधित होता है और इसलिए अनुभाग को केवल पढ़ने योग्य स्मृति में रखा जाता है। इसमें ऐसे निर्देश शामिल हैं जिन्हें निष्पादित किया जाना है और इसलिए CODE ध्वज।

प्रारंभिक स्थिर स्टोरेज क्लास के साथ चर .data अनुभाग में जाते हैं। उनके प्रारंभिक मान फ़ाइल में संग्रहीत होते हैं और प्रक्रिया के निर्माण के रूप में वहां से पढ़ते हैं।सी/सी ++ में ये वैश्विक चर, स्थैतिक स्थानीय चर और सी ++ स्थैतिक सदस्य चर हैं जिन्हें उचित रूप से प्रारंभ किया गया है, उदा। static int a = 10;। फोरट्रान स्थान SAVE -d चर और COMMON ब्लॉक प्रारंभ किए गए हैं, जिन्हें ब्लॉक DATA कथन के साथ इंटियल मान दिया जाता है।

.bss अनुभाग (ऐतिहासिक नाम, से संक्षिप्त नाम द्वारा प्रारंभ किया गया ब्लॉक सबसे सरल है। इसमें स्थिर भंडारण वर्ग के साथ अनियंत्रित चर शामिल हैं। यह SHT_NOBITS प्रकार का एक वर्ग है और फ़ाइल में कोई स्थान नहीं लेता है। मेमोरी ALLOC इसके लिए बनाई गई है लेकिन स्मृति से प्रीपॉप्लेट करने के लिए फ़ाइल से कुछ भी नहीं पढ़ा जाता है - यह केवल कर्नेल मेमोरी आवंटक द्वारा वितरित किए गए सभी शून्यों को रहता है।

स्थिरांक आमतौर पर .rodata धारा (अपने उदाहरण में मौजूद नहीं) है, जो .data की तरह दिखता है, लेकिन लिखने योग्य के रूप में चिह्नित नहीं कर रहा है और इस तरह READONLY के रूप में दिखाया गया है में जाने।

+0

लिंक # 2 अब टूट गया है। :( –

+0

बहुत बुरा, वास्तव में –

+0

मैंने objdump -h को एक स्थानापन्न फ़ाइल (कच्ची .o फ़ाइल, यानी प्रोग्राम शीर्षलेख के बिना फ़ाइल) पर चलाने का प्रयास किया, और यह अभी भी लोड विशेषता के साथ खंड (उदाहरण के लिए .text) सूचीबद्ध है। यह मुझे स्पष्ट नहीं है कि लोड और एएलएलसी के बीच क्या अंतर है। हो सकता है कि यह सिर्फ लोड = ALLOC और सामग्री –

4

Ubuntu elf man page पर जानकारी के टुकड़े मिले और यह मेरी समझ है।
मुझे लगता है कि वे program header और section header दोनों से जानकारी हैं।

LOAD: may correspond to PT_LOAD in the Program header table. Brief description: 
It specifies the type of that particular element in the program header table. 
The array element specifies a loadable segment 

ALLOC: may correspond to SHF_ALLOC in the section table. Brief description: 
Its specifies the flag of that particular element in the section header. 
This section occupies memory during process execution. 

CODE/ DATA: indicates the belonging segment 

READONLY: specifies a read-only segment 

CONTENTS: I didn't find anything to conclude. 

आशा इस