2011-06-02 11 views
6

ओबीजेडम्प एल्फ अनुभागों के भौतिक पते (एलएमए) की गणना कैसे करता है? जहां तक ​​मैं कह सकता हूं, एएलएफ सेक्शन हेडर में केवल अनुभागों का वर्चुअल एड्रेस (वीएमए) होता है [1]।एल्फ़ फाइलों में सेक्शन के आभासी और भौतिक पते

आमतौर पर, वीएमए और एलएमए समान होते हैं। लेकिन आरंभिक डेटा खंड (.डेटा) के लिए, वीएमए चर के रैम स्थान है और एलएमए रोम स्थान है जहां प्रारंभिक मान स्थित हैं। मुख्य() को कॉल करने से पहले प्रारंभिक मानों को रैम में कॉपी करने के लिए सीआरटी 0 जिम्मेदार है। उदाहरण के लिए:

$ objdump -h my.elf 
Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .text   0003c3d0 00080000 00080000 00010000 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    5 .data   000008d0 40000000 000d08d4 00060000 2**3 
        CONTENTS, ALLOC, LOAD, DATA 

टॉम

[1] http://www.ouah.org/RevEng/x430.htm

+0

मुझे इस विषय के बारे में कोई जानकारी नहीं है लेकिन ऐसा लगता है कि एलएमए [लिंकर स्क्रिप्ट] (https://sourceware.org/binutils/docs-2.18/ld/Output-Section-LMA.html) द्वारा दिया गया है। ('एटी' का उपयोग कर)। – ysdx

उत्तर

0

स्थायी पता ELF फ़ाइल खंड की एक विशेषता है। ईएलएफ फ़ाइल खंड में ऐसी विशेषता नहीं है। यह खंड संभव है कि खंडों को संबंधित खंड की स्मृति में मैप करें।

भौतिक पते का अर्थ आर्किटेक्चर निर्भर है और विभिन्न ओएस और हार्डवेयर प्लेटफार्मों के बीच भिन्न हो सकता है।

इस link से:

p_paddr - प्रणालियों जिसके लिए शारीरिक को संबोधित पर प्रासंगिक है, इस सदस्य खंड के भौतिक पते के लिए आरक्षित है। क्योंकि सिस्टम वी एप्लिकेशन प्रोग्राम के लिए भौतिक एड्रेसिंग को अनदेखा करता है, इस सदस्य के पास निष्पादन योग्य फ़ाइलों और साझा ऑब्जेक्ट्स के लिए अनिर्दिष्ट सामग्री है।

ऐसा लगता है कि आपकी सीआरटी 0 ईएलएफ फ़ाइल में स्थित भौतिक पते के अर्थ के बारे में कुछ धारणा करता है। यह धारणा विशेष प्रणाली के लिए सच हो सकती है, लेकिन किसी अन्य पर गारंटी नहीं है।

6

LMA के बारे में इस खोजें: http://www-zeuthen.desy.de/dv/documentation/unixguide/infohtml/binutils/docs/ld/Basic-Script-Concepts.html#Basic-Script-Concepts

महत्वपूर्ण पीछा कर रहा है:

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

+0

फ़ाइल बंद क्या है? – electro

4

अनुभाग शीर्षलेख में एक ही पता होगा। ऐसा लगता है कि सेक्शन हेडर में पता वीएमए है। प्रोग्राम हेडर में एलएमए को वीएमए का मैपिंग शामिल है। तो,

Program Header: 
<a few lines removed> 
    LOAD off 0x00000240 vaddr 0x00000048 paddr 0x0000018c align 2**0 
     filesz 0x00000000 memsz 0x00000004 flags rw- 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
<a few lines removed> 
    3 .bss   00000004 00000048 0000018c 00000240 2**1 
        ALLOC 

.bss 0x48 की एक VMA है:

उदाहरण के लिए, यहाँ का एक टुकड़ा क्या "objdump -x" मेरे योगिनी फ़ाइल के लिए पता चलता है। यदि आप प्रोग्राम हेडर देखते हैं, तो एक प्रविष्टि में 0x48 का "vaddr" होता है और 0x18c का पैडर होता है, जो एलएमए है।

+0

मुझे लगता है कि आपका अनुमान सही है। यहां एक संबंधित प्रश्न है: https://stackoverflow.com/questions/39888381/elf-loading-when-vma-lma लेखक ने कहा: यह महसूस करने में सहायता करता है कि "वीएमए" और "एलएमए" जीएनयू उपयोगिता शब्दावली हैं और नहीं ईएलएफ विनिर्देशन में .... कुछ वातावरण p_paddr का उपयोग भौतिक पते के रूप में नहीं करते हैं, लेकिन लोड पता (इसलिए "एलएमए") .... –

संबंधित मुद्दे