我目前正在尝试编写自己的程序来反映 pmap 命令,特别是在 Solaris 9 上。我无法解析库的名称和路径。来自 bash shell 的 Solaris 命令的输出如下所示:
bash-2.05# pmap $$
2427: bash
00010000 496K r-x-- /usr/bin/bash
0009A000 80K rwx-- /usr/bin/bash
000AE000 120K rwx-- [ heap ]
FF100000 688K r-x-- /usr/lib/libc.so.1
FF1BC000 24K rwx-- /usr/lib/libc.so.1
FF1C2000 8K rwx-- /usr/lib/libc.so.1
FF200000 568K r-x-- /usr/lib/libnsl.so.1
FF29E000 32K rwx-- /usr/lib/libnsl.so.1
FF2A6000 32K rwx-- /usr/lib/libnsl.so.1
FF2F0000 8K rwx-- [ anon ]
FF300000 16K r-x-- /usr/lib/libmp.so.2
FF314000 8K rwx-- /usr/lib/libmp.so.2
FF320000 8K r-x-- /usr/platform/sun4u-us3/lib/libc_psr.so.1
FF330000 40K r-x-- /usr/lib/libsocket.so.1
FF34A000 8K rwx-- /usr/lib/libsocket.so.1
FF350000 168K r-x-- /usr/lib/libcurses.so.1
FF38A000 32K rwx-- /usr/lib/libcurses.so.1
FF392000 8K rwx-- /usr/lib/libcurses.so.1
FF3A0000 8K r-x-- /usr/lib/libdl.so.1
FF3B0000 8K rwx-- [ anon ]
FF3C0000 152K r-x-- /usr/lib/ld.so.1
FF3F6000 8K rwx-- /usr/lib/ld.so.1
FFBFC000 16K rw--- [ stack ]
total 2536K
我可以通过阅读 /proc/$$/map 来复制程序的基本功能,但剩下的就是弄清楚如何解析库名称,如右侧所示。/proc/$$/map 仅给出 /proc/$$/object 中文件的名称,它们只是通用名称。在 Solaris 10(我有一个盒子)上,我似乎能够使用 /proc/$$/path,其中包含符号链接,但我正在处理的盒子没有这些。有人对如何获取这些库名称有任何直接的想法吗?当我捆绑程序时,它似乎打开 /proc/$$/as 并查看内存并以某种方式找到它们,但我还无法弄清楚它在哪里寻找或为什么。