Как интерпретировать этот вывод PMAP? - PullRequest
1 голос
/ 02 ноября 2019

У меня есть программа cat ++ , и я запускаю следующую команду, чтобы проверить, сколько сегментов памяти добавляется в процесс при загрузке любой из библиотек, реализующих преобразование.

(echo "hello world" ; sleep 100) | ./cat++ -l ./librot13.so -l ./libupper.so -l ./librot13.so & pmap $!

Я получаю следующий вывод, но не могу его интерпретировать. Сколько сегментов памяти загружается? Что происходит, когда одна и та же библиотека вызывается дважды, как в моей команде? Есть ли альтернативная команда pmap, которую я должен выполнить?

3847:   ./cat++ -l ./librot13.so -l ./libupper.so -l ./librot13.so
000055ec84326000      8K r-x-- cat++
000055ec84527000      4K r---- cat++
000055ec84528000      4K rw--- cat++
000055ec84ef3000    132K rw---   [ anon ]
00007f07540d6000      4K r-x-- libupper.so
00007f07540d7000   2044K ----- libupper.so
00007f07542d6000      4K r---- libupper.so
00007f07542d7000      4K rw--- libupper.so
00007f07542d8000      4K r-x-- librot13.so

продолжение ...

1 Ответ

0 голосов
/ 04 ноября 2019

Когда сегменты памяти созданы, им дают разрешения - чтение, запись и выполнение - или rwx для краткости. В выводе, который вы видите, указан адрес виртуальной памяти сегмента, а также размер этого сегмента, разрешения этого сегмента и имя (если доступно) файла, используемого для заполнения сегмента. Это довольно стандартные результаты чего-то вроде команды mmap, которая часто используется за кулисами загрузчиком для помощи в загрузке библиотек. Именно так интерпретируется формат вашего вывода.

Сколько сегментов памяти загружается? Кажется, что каждый из включенных вами файлов имеет read / executesection (очень часто для разделов кода, таких как .text), раздел readonly (общий для разделов только для чтения, таких как .rodata), и раздел read / write (общий для разделов глобальных данных, таких как .data. По причинам, обычно связанным с безопасностью и стандартизацией, эти части файла загружаются в сегменты с различными разрешениями. Например, вы, как правило, не хотите, чтобы инструкции вашей программы были доступны для записи (в противном случае произвольная уязвимость записи в память могла быпозволить злоумышленникам написать свои собственные инструкции в вашем адресном пространстве).

Что происходит, когда одна и та же библиотека вызывается дважды, как в моей команде? Короче говоря, не беспокойтесь о нескольких сегментахсоздается для отдельного файла. Файл загружается не более одного раза. Скорее, части файлафайлы загружаются на основе их разрешений. Это потому, что все функции, которые я упомянул выше.

Если вы хотите немного лучше понять формат файла ELF и посмотреть, как загрузчик знает, как создавать сегменты памяти, попробуйте использовать утилиту readelf на вашем компьютере. cat++ программа. Заголовки программы покажут вам количество сегментов, разделы в каждом сегменте и разрешения каждого сегмента (и многое другое). Попробуйте readelf -l cat++ и убедитесь сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...