পিএমএপ আউটপুট এর অর্থ


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

কে দ্বারা বিভক্ত মোট (3876) VIRTএর আউটপুটে কলামের সমান top। এখন কোথায় টেক্সট সেগমেন্ট? 400000, 600000 এবং 601000 এ, তাই না? কোথায় আমি একটি ব্যাখ্যা কোথায় পড়তে পারি? man pmapসাহায্য না.


পাঠ্য বিভাগগুলি কেবলমাত্র পঠিত, তাই এটি 0000000000600000 এ।
ডানিলা লাডনার

ধন্যবাদ! পাঠ্য বিভাগটিও কার্যকরভাবে কার্যকর করা উচিত নয়?
থারস্টেন স্টার্ক

1
হ্যাঁ তুমিই ঠিক. r এবং rx। 0000000000400000 পাশাপাশি।
ড্যানিলা লাডনার

উত্তর:


14

পাঠ্য বিভাগটি 0x400000 এ ম্যাপিং - এটি পাঠযোগ্য এবং কার্যকর করার জন্য 'আরএক্স' চিহ্নিত করা হয়েছে। 0x600000 এ ম্যাপিংটি কেবল পঠনযোগ্য, সুতরাং এটি প্রায় কার্যকরভাবে এক্সিকিউটেবল ফাইলের ".rodata" বিভাগ। জিসিসি সি স্ট্রিং লিটারেলগুলিকে কেবল পঠন বিভাগে রাখে। 0x601000 এ ম্যাপিংটি 'rw-', সুতরাং সম্ভবত এটিই বিখ্যাত apগল। আপনার এক্সিকিউটেবল malloc()1024 বাইট থাকতে পারে এবং নিশ্চিতভাবে দেখতে ঠিকানাটি মুদ্রণ করতে পারেন।

আপনার প্রক্রিয়াটির পিআইডি সন্ধান করে এবং করার মাধ্যমে আপনি কিছুটা আরও তথ্য পেতে পারেন: cat /proc/$PID/maps- আমার আর্চ ল্যাপটপে যা কিছু অতিরিক্ত তথ্য দেয়। এটি একটি 3.12 কার্নেল চালাচ্ছে, তাই /proc/$PID/numa_mapsএটিরও রয়েছে এবং ক্যাটিং যা একটি ছোট্ট অন্তর্দৃষ্টি দিতে পারে।

এক্সিকিউটেবল ফাইলটিতে চালানো অন্যান্য জিনিস: nmএবং objdump -x। প্রাক্তন আপনাকে মেমরির মানচিত্রে বিভিন্ন জিনিস কোথায় রয়েছে তার একটি ধারণা দিতে পারে, যাতে আপনি অন্যান্য বিভাগের তুলনায় 0x4000000 বিভাগে কী দেখতে পান। objdump -xআপনাকে প্রচুর অন্যান্য বিষয়গুলির মধ্যে ইএলএফ ফাইল শিরোনাম দেখায়, যাতে আপনি বিভাগের নামগুলি সহ সম্পূর্ণ বিভাগ এবং সেগুলি রান ম্যাপে ম্যাপ করা হয়েছে কিনা তা আপনি দেখতে পাচ্ছেন।

যতদূর "কী আছে" এর লিখিত ব্যাখ্যা সন্ধান করার জন্য আপনাকে "ইএলএফ ফাইল মেমরি লেআউট" এর জন্য গুগলের মতো জিনিস করতে হবে। সচেতন থাকুন যে ELF ফাইল ফর্ম্যাটটি সাধারণভাবে ব্যবহারের চেয়ে আরও বেশি বিদেশী মেমরি লেআউটকে সমর্থন করতে পারে। জিসিসি এবং গনু এলডি এবং গ্লিবসি সকলেই কার্যকর করার যোগ্য ফাইল কীভাবে আউট করা যায় এবং রান চলাকালীন সময়ে মেমরিতে ম্যাপ করা যায় সে সম্পর্কে সহজ অনুমানগুলি তৈরি করে। এটি নথির জন্য প্রচুর ওয়েব পৃষ্ঠাগুলি বিদ্যমান রয়েছে, তবে এটি কেবল লিনাক্সের পুরানো সংস্করণ, জিসিসির পুরানো সংস্করণ বা গ্লিবিকের ক্ষেত্রে প্রযোজ্য বা কেবল x86 এক্সিকিউটেবলের জন্য প্রযোজ্য। আপনার যদি এটি না থাকে তবে readelfকমান্ডটি পান। আপনি যদি সি প্রোগ্রাম লিখতে পারেন তবে নিজের সংস্করণ তৈরি করুন objdump -xবা readelfএক্সিকিউটেবল ফাইল কীভাবে কাজ করেন এবং সেগুলির মধ্যে কী রয়েছে সে সম্পর্কে আপনার পরিচিত হতে পারেন।


2
দুর্দান্ত উত্তর। এখন, প্রোগ্রামটির গাদা কোথায়? এবং এই [অনন] এর অর্থ কী? এটি খুঁজে পেতে আমার গুগল কী আছে?
থারস্টেন স্টার্ক

1
তুমি কি জান? আমি 0x601000 ঠিকানা ম্যাপিং সম্পর্কে ভুল ছিলাম - এটি হ'ল সম্ভবত। আপনাকে এটি ব্যবহার করতে হবে readelfবা objdumpএটি নির্ধারণ করতে হবে এবং আপনি নির্বাহযোগ্য যা কিছু করতে পারেন। আমার আর্চ লিনাক্স বাক্সটি /usr/lib/libc-2.18.so ব্যবহার করে, সুতরাং এটি আপনার বাক্সের থেকে একেবারেই আলাদা।
ব্রুস এডিগার

2
0x601000ডেটা বিভাগ। এটা রয়েছে .data, .bssএবং এর মাধ্যমে বাড়ানো যেতে পারে brk()[anon]এর মাধ্যমে প্রাপ্ত নন-ফাইল ব্যাকড মেমরি (তাই সোয়াপ দ্বারা ব্যাকড) নির্দেশ করে mmap()। dlmalloc brk()~ 64Kb IIRC এর চেয়ে কম বরাদ্দের mmap()জন্য এবং বৃহত্তর বরাদ্দের জন্য ব্যবহার করে। হিপ মলোক দ্বারা বরাদ্দ করা সমস্ত কিছু, ডেটা বিভাগের বর্ধিত অংশ এবং mmap()ভিত্তিক বরাদ্দ উভয়ই ।
নিনজালজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.