Сенс виводу pmap


12

Я писав main.cу Linux:

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), поділене на K, дорівнює VIRTстовпцю на виході top. Тепер де текстовий сегмент? На 400000, 600000 і 601000, правда? Де я можу прочитати пояснення, що є де? man pmapне допомогло.


текстові сегменти насправді лише для читання, тому це на 0000000000600000.
Даніла Ладнер

Дякую! Чи не повинен текстовий сегмент бути також виконаним?
Thorsten Staerk

1
Так, ти маєш рацію. r і rx. 0000000000400000 також.
Даніла Ладнер

Відповіді:


15

Текстовий сегмент - це відображення на 0x400000 - він позначений "rx" для читабельного та виконуваного файлу. Відображення в 0x600000 є лише для читання, тому це майже напевно розділ ".rodata" виконуваного файлу. GCC розміщує лінійні рядки C у розділ лише для читання. Відображення в 0x601000 - "rw-", тож це, мабуть, знаменита купа. Ви можете мати свій виконуваний malloc()1024 байт і роздрукувати адресу, щоб точно подивитися.

Ви можете отримати трохи більше інформації, знайшовши PID вашого процесу та зробивши: cat /proc/$PID/maps- на моєму ноутбуці Arch, що дає додаткову інформацію. Він працює з ядром 3.12, так що він також має /proc/$PID/numa_maps, і котирування, що також може дати невелике розуміння.

Інші речі для запуску виконуваного файлу: nmі objdump -x. Перший може дати вам уявлення про те, де на карті пам'яті лежать різні речі, тож ви зможете побачити, що знаходиться в розділі 0x4000000 порівняно з іншими розділами. objdump -xпоказує заголовки файлів ELF серед безлічі інших речей, тож ви можете побачити всі розділи, доповнені назвами розділів та чи вони відображаються під час виконання чи ні.

Що стосується пошуку письмового пояснення "що є де", вам доведеться робити такі речі, як Google для "Макет пам'яті ELF FILE". Майте на увазі, що формат файлу ELF може підтримувати більш екзотичні макети пам'яті, ніж зазвичай. GCC та Gnu ld та glibc роблять спрощення припущень щодо того, як виконується файл викладається, а потім відображається в пам'ять під час виконання. Існує багато веб-сторінок, які мають намір документувати це, але стосуються лише старих версій Linux, старих версій GCC або glibc, або застосовуються лише до x86 виконуваних файлів. Якщо у вас його немає, отримайте readelfкоманду. Якщо ви можете писати програми на C, створіть власну версію objdump -xабо readelfознайомтеся з тим, як працюють виконувані файли та що в них.


2
Чудова відповідь. Тепер, де купа програми? І що це означає [anon]? Що мені потрібно шукати в Google, щоб дізнатися це?
Thorsten Staerk

1
Знаєш, що? Я помилявся щодо відображення адреси 0x601000 - це, мабуть, купа. Вам доведеться скористатися readelfабо objdumpрозібратися в цьому, і що б ви не виконали. У моєму вікні Arch linux використовується /usr/lib/libc-2.18.so, тож він зовсім інший, ніж ваш.
Брюс Едігер

2
0x601000- це сегмент даних. Вона містить .data, .bssі може бути розширена з допомогою brk(). [anon]вказує на файли, що не підтримуються файлами (так підкріплені свопом), отримані через mmap(). dlmalloc використовує brk()для виділень, менших ~ 64 Кб IIRC, і mmap()для більших асигнувань. Купа - це все, що виділяється malloc, і розширена частина сегмента даних, і mmap()розподіли на основі.
ніндзя
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.