2014-01-07 7 views
2

Я смотрю на proc/ID/maps под встроенным Linux, И я заметил, что некоторые библиотеки с несколькими библиотеками появляются несколько раз на карте памяти процесса почему это так ?Почему proc/ID/maps имеет несколько записей для разделяемых библиотек

40094000-400d9000 r-xp 00000000 b3:09 723  /system/lib/libc.so 
400d9000-400da000 ---p 00000000 00:00 0 
400da000-400dc000 r-xp 00045000 b3:09 723  /system/lib/libc.so 
400dc000-400de000 rwxp 00047000 b3:09 723  /system/lib/libc.so 
400de000-400e9000 rwxp 00000000 00:00 0 
400e9000-400ed000 r-xp 00000000 b3:09 770  /system/lib/libgccdemangle.so 
400ed000-400ee000 ---p 00000000 00:00 0 
400ee000-400ef000 r-xp 00004000 b3:09 770  /system/lib/libgccdemangle.so 
400ef000-400f0000 rwxp 00005000 b3:09 770  /system/lib/libgccdemangle.so 
40102000-40103000 r-xp 00000000 b3:09 869  /system/lib/libstdc++.so 
40103000-40104000 r-xp 00000000 b3:09 869  /system/lib/libstdc++.so 
40104000-40105000 rwxp 00001000 b3:09 869  /system/lib/libstdc++.so 
40105000-40112000 r-xp 00000000 b3:09 738  /system/lib/libcutils.so 
40112000-40113000 r-xp 0000c000 b3:09 738  /system/lib/libcutils.so 
40113000-40114000 rwxp 0000d000 b3:09 738  /system/lib/libcutils.so 
+0

его связь может помочь вам: http://stackoverflow.com/questions/20726346/why-i-can-see-the-several-same-segments- в-PROC-ПИД- карт-вывода – Phorus

ответ

3

Поскольку ELF разделяемая библиотека имеет, как исполняемый файл, несколько сегментов: часто «текст» только для чтения сегмент (который mmap -ED совместно, так что все процессы, использующие эту долю сегмента некоторой физической RAM) , а «данные» читают сегмент записи (для статических или «глобальных» переменных и, возможно, также PLT ...), частных для каждого процесса.

Это объясняется очень подробно в Drepper's paper: How to write a shared library