我正在研究embedded式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
因为ELF共享库和可执行文件一样,具有多个段:通常是“text” 只读段( mmap
shared是共享的,所以使用该段的所有进程共享一些物理RAM),以及“data” 读写段 (对于静态或“全局”变量,也可能是PLT …),对每个进程都是私有的。
这在Drepper的论文中有详细的解释: 如何编写共享库