Pmap के उत्पादन का अर्थ


12

मैंने main.cलिनक्स में लिखा है:

int main()
{
  while (1){}
}

जब मैं इसे संकलित और शुरू करता हूं, तो मैं pmapयह कर सकता हूं :

# pmap 28578
28578:   ./a.out
0000000000400000      4K r-x--  /root/a.out
0000000000600000      4K r----  /root/a.out
0000000000601000      4K rw---  /root/a.out
00007f87c16c2000   1524K r-x--  /lib/libc-2.11.1.so
00007f87c183f000   2044K -----  /lib/libc-2.11.1.so
00007f87c1a3e000     16K r----  /lib/libc-2.11.1.so
00007f87c1a42000      4K rw---  /lib/libc-2.11.1.so
00007f87c1a43000     20K rw---    [ anon ]
00007f87c1a48000    128K r-x--  /lib/ld-2.11.1.so
00007f87c1c55000     12K rw---    [ anon ]
00007f87c1c65000      8K rw---    [ anon ]
00007f87c1c67000      4K r----  /lib/ld-2.11.1.so
00007f87c1c68000      4K rw---  /lib/ld-2.11.1.so
00007f87c1c69000      4K rw---    [ anon ]
00007fff19b82000     84K rw---    [ stack ]
00007fff19bfe000      8K r-x--    [ anon ]
ffffffffff600000      4K r-x--    [ anon ]
 total             3876K

K द्वारा विभाजित कुल (3876) VIRTआउटपुट में स्तंभ के बराबर होता है top। अब पाठ खंड कहां है? 400000, 600000 और 601000 पर, है ना? मैं एक स्पष्टीकरण कहां पढ़ सकता हूं कि कहां है? man pmapकोई सहायता नहीं की।


टेक्स्ट सेगमेंट वास्तव में केवल पढ़ा जाता है, इसलिए यह 0000000000600000 पर है।
डैनिला लैडनर

धन्यवाद! पाठ खंड के रूप में अच्छी तरह से निष्पादन योग्य नहीं होना चाहिए?
थोरस्टेन स्टैकर

1
हाँ आप सही है। आर और आरएक्स। 0000000000400000 के रूप में अच्छी तरह से।
दानिला लाडनेर

जवाबों:


15

पाठ खंड 0x400000 पर मैपिंग है - यह पठनीय और निष्पादन योग्य के लिए 'आरएक्स' चिह्नित है। 0x600000 पर मैपिंग केवल-पढ़ने के लिए है, इसलिए यह निश्चित रूप से निष्पादन योग्य फ़ाइल का ".rodata" खंड है। जीसीसी सी स्ट्रिंग शाब्दिक को केवल-पढ़ने के लिए अनुभाग में रखता है। 0x601000 पर मैपिंग 'rw-' है, इसलिए यह संभवतया प्रसिद्ध है। आपके पास निष्पादन योग्य malloc()1024 बाइट्स हो सकते हैं और सुनिश्चित करने के लिए पता प्रिंट कर सकते हैं।

आप अपनी प्रक्रिया के पीआईडी ​​को खोजकर, और cat /proc/$PID/mapsमेरे आर्क लैपटॉप पर कुछ और जानकारी प्राप्त कर सकते हैं, जो कुछ अतिरिक्त जानकारी देता है। यह एक 3.12 कर्नेल चला रहा है, इसलिए इसमें भी है /proc/$PID/numa_maps, और इसे एक छोटी सी अंतर्दृष्टि भी दे सकता है।

निष्पादन योग्य फ़ाइल पर चलने के लिए अन्य चीजें: nmऔर objdump -x। पूर्व आपको अंदाजा दे सकता है कि मेमोरी मैप में विभिन्न चीजें कहां हैं, इसलिए आप देख सकते हैं कि 0x4000000 अनुभाग बनाम अन्य अनुभागों में क्या है। objdump -xआपको कई अन्य चीजों के बीच ईएलएफ फ़ाइल हेडर दिखाता है, जिससे आप सभी वर्गों को देख सकते हैं, अनुभाग नामों के साथ पूरा कर सकते हैं और वे एक रन समय में मैप किए गए हैं या नहीं।

जहां तक ​​"व्हाट इज व्हेयर" की लिखित व्याख्या पाने की बात है, तो आपको "ELF FILE मेमोरी लेआउट" के लिए Google जैसी चीजें करनी होंगी। विदित हो कि ELF फाइल फॉर्मेट आमतौर पर इस्तेमाल होने की तुलना में अधिक विदेशी मेमोरी लेआउट का समर्थन कर सकता है। GCC और Gnu ld और glibc सभी इस बात को सरल बनाते हैं कि एक निष्पादन योग्य फ़ाइल कैसे रखी जाती है और फिर रन टाइम में मेमोरी में मैप की जाती है। बहुत सारे वेब पेज मौजूद हैं, जो इस दस्तावेज़ को प्रस्तुत करते हैं, लेकिन केवल लिनक्स के पुराने संस्करणों पर लागू होते हैं, जीसीसी के पुराने संस्करणों या ग्लिबक पर, या केवल x86 निष्पादन योग्य पर लागू होते हैं। यदि आपके पास यह नहीं है, तो readelfकमांड प्राप्त करें । यदि आप सी प्रोग्राम लिख सकते हैं, तो अपने स्वयं के संस्करण का निर्माण कर सकते हैं objdump -xया readelfकैसे निष्पादन योग्य फ़ाइलों से परिचित हो सकते हैं, और उनमें क्या है।


2
बहुत बढ़िया जवाब। अब, कार्यक्रम का ढेर कहाँ है? और इसका क्या मतलब है [anon]? इसका पता लगाने के लिए मुझे क्या करना होगा?
थोरस्टेन स्टैक

1
आपको पता है कि? मैं 0x601000 एड्रेस मैपिंग के बारे में गलत था - यह ढेर है, शायद। आपको इसका उपयोग करना होगा readelfया objdumpयह पता लगाना होगा, और जो भी निष्पादन योग्य आपने बनाया है। मेरा Arch linux बॉक्स /usr/lib/libc-2.18.so का उपयोग करता है, इसलिए यह आपके बॉक्स से काफी अलग है।
ब्रूस एडिगर

2
0x601000डेटा खंड है। इसमें शामिल है .data, .bssऔर के माध्यम से बढ़ाया जा सकता है brk()[anon]के माध्यम से प्राप्त गैर-फ़ाइल समर्थित मेमोरी (ताकि स्वैप द्वारा समर्थित) इंगित करता है mmap()। dlmalloc brk()~ 64Kb IIRC से छोटे आवंटन के mmap()लिए और बड़े आवंटन के लिए उपयोग करता है । ढेर मालॉक द्वारा आवंटित किया गया सब कुछ है, दोनों डेटा खंड का विस्तारित हिस्सा और mmap()-बेड आवंटन।
निंजालज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.