/proc/<pid>/map 显示比 ldd for busybox 更多的共享库
/proc/<pid>/map shows more shared library than ldd for busybox
为什么 /proc/<pid>/maps
显示的共享库比 ldd
程序多?
这是一个例子:
# ------------ Embedded Linux side ------------
# ps
.....
28 root [jffs2_gcd_mtd2]
132 root -/bin/sh ---> the target to show
155 root [kworker/0:2]
# # Note: -/bin/sh is actually /bin/busybox
# cat /proc/132/maps
00400000-004bc000 r-xp 00000000 1f:02 34 /bin/busybox
004cc000-004cd000 rw-p 000bc000 1f:02 34 /bin/busybox
004cd000-004ee000 rw-p 00000000 00:00 0 [heap]
775bb000-775cb000 rw-p 00000000 00:00 0
775cb000-775d6000 r-xp 00000000 1f:02 397 /lib/libnss_files-2.22.so
775d6000-775e5000 ---p 0000b000 1f:02 397 /lib/libnss_files-2.22.so
775e5000-775e6000 r--p 0000a000 1f:02 397 /lib/libnss_files-2.22.so
775e6000-775e7000 rw-p 0000b000 1f:02 397 /lib/libnss_files-2.22.so
775e7000-775ed000 rw-p 00000000 00:00 0
775ed000-7775a000 r-xp 00000000 1f:02 382 /lib/libc-2.22.so
7775a000-7776a000 ---p 0016d000 1f:02 382 /lib/libc-2.22.so
7776a000-7776d000 r--p 0016d000 1f:02 382 /lib/libc-2.22.so
7776d000-77770000 rw-p 00170000 1f:02 382 /lib/libc-2.22.so
77770000-77772000 rw-p 00000000 00:00 0
77772000-77795000 r-xp 00000000 1f:02 374 /lib/ld-2.22.so
777a1000-777a2000 rw-p 00000000 00:00 0
777a3000-777a4000 rw-p 00000000 00:00 0
777a4000-777a5000 r--p 00022000 1f:02 374 /lib/ld-2.22.so
777a5000-777a6000 rw-p 00023000 1f:02 374 /lib/ld-2.22.so
7fb42000-7fb63000 rwxp 00000000 00:00 0 [stack]
7fff7000-7fff8000 r-xp 00000000 00:00 0 [vdso]
# cksum /bin/busybox
698740119 773496 /bin/busybox
#---------- Then on the PC side ----------------
$ cksum ./busybox
698740119 773496 bin/busybox
$ /usr/local/bin/mips-linux-gnu-ldd bin/busybox
checking sub-depends for 'not found'
libc.so.6 => not found (0x00000000)
/lib/ld.so.1 => /lib/ld.so.1 (0x00000000)
cksum
用于检查文件是否相同。
从 PC 端 ldd
交叉工具,它显示 busybox 仅依赖于 libc
和 ld
。
然而,在真实的 运行 时间环境中,/proc/132/maps
显示了一个共享库,/lib/libnss_files-2.22.so
.
确认我们是否有间接依赖:
$ /usr/local/bin/mips-linux-gnu-ldd lib/libc.so.6
/lib/ld.so.1 => /lib/ld.so.1 (0x00000000)
$ /usr/local/bin/mips-linux-gnu-ldd lib/ld.so.1
not a dynamic executable
没有。 ldd
表明 libc
依赖于 ld
,这已经是 busybox
的依赖之一。
一个进程可以 dlopen(3)
一个共享对象并将其加载到它的地址 space 而无需将其链接到它。这意味着共享对象不需要出现在 ldd(1)
输出中就可以出现在程序的 运行 实例中。
我并不是说情况就是这样,但您可以开发共享对象,其唯一目的是向具有 open 设计的程序添加(未知)功能按需合并库。
通常,这些程序不会出现在 ldd
输出中。
libnss_files
是 libc 的一个组件。它按需加载,用于在静态文件中执行名称查找,如 /etc/passwd
和 /etc/hosts
。 (还有 libnss_dns
用于 DNS 查找。)
有关详细信息,请参阅 NSS (Name Service Switch) 的 libc 文档。
为什么 /proc/<pid>/maps
显示的共享库比 ldd
程序多?
这是一个例子:
# ------------ Embedded Linux side ------------
# ps
.....
28 root [jffs2_gcd_mtd2]
132 root -/bin/sh ---> the target to show
155 root [kworker/0:2]
# # Note: -/bin/sh is actually /bin/busybox
# cat /proc/132/maps
00400000-004bc000 r-xp 00000000 1f:02 34 /bin/busybox
004cc000-004cd000 rw-p 000bc000 1f:02 34 /bin/busybox
004cd000-004ee000 rw-p 00000000 00:00 0 [heap]
775bb000-775cb000 rw-p 00000000 00:00 0
775cb000-775d6000 r-xp 00000000 1f:02 397 /lib/libnss_files-2.22.so
775d6000-775e5000 ---p 0000b000 1f:02 397 /lib/libnss_files-2.22.so
775e5000-775e6000 r--p 0000a000 1f:02 397 /lib/libnss_files-2.22.so
775e6000-775e7000 rw-p 0000b000 1f:02 397 /lib/libnss_files-2.22.so
775e7000-775ed000 rw-p 00000000 00:00 0
775ed000-7775a000 r-xp 00000000 1f:02 382 /lib/libc-2.22.so
7775a000-7776a000 ---p 0016d000 1f:02 382 /lib/libc-2.22.so
7776a000-7776d000 r--p 0016d000 1f:02 382 /lib/libc-2.22.so
7776d000-77770000 rw-p 00170000 1f:02 382 /lib/libc-2.22.so
77770000-77772000 rw-p 00000000 00:00 0
77772000-77795000 r-xp 00000000 1f:02 374 /lib/ld-2.22.so
777a1000-777a2000 rw-p 00000000 00:00 0
777a3000-777a4000 rw-p 00000000 00:00 0
777a4000-777a5000 r--p 00022000 1f:02 374 /lib/ld-2.22.so
777a5000-777a6000 rw-p 00023000 1f:02 374 /lib/ld-2.22.so
7fb42000-7fb63000 rwxp 00000000 00:00 0 [stack]
7fff7000-7fff8000 r-xp 00000000 00:00 0 [vdso]
# cksum /bin/busybox
698740119 773496 /bin/busybox
#---------- Then on the PC side ----------------
$ cksum ./busybox
698740119 773496 bin/busybox
$ /usr/local/bin/mips-linux-gnu-ldd bin/busybox
checking sub-depends for 'not found'
libc.so.6 => not found (0x00000000)
/lib/ld.so.1 => /lib/ld.so.1 (0x00000000)
cksum
用于检查文件是否相同。
从 PC 端 ldd
交叉工具,它显示 busybox 仅依赖于 libc
和 ld
。
然而,在真实的 运行 时间环境中,/proc/132/maps
显示了一个共享库,/lib/libnss_files-2.22.so
.
确认我们是否有间接依赖:
$ /usr/local/bin/mips-linux-gnu-ldd lib/libc.so.6
/lib/ld.so.1 => /lib/ld.so.1 (0x00000000)
$ /usr/local/bin/mips-linux-gnu-ldd lib/ld.so.1
not a dynamic executable
没有。 ldd
表明 libc
依赖于 ld
,这已经是 busybox
的依赖之一。
一个进程可以 dlopen(3)
一个共享对象并将其加载到它的地址 space 而无需将其链接到它。这意味着共享对象不需要出现在 ldd(1)
输出中就可以出现在程序的 运行 实例中。
我并不是说情况就是这样,但您可以开发共享对象,其唯一目的是向具有 open 设计的程序添加(未知)功能按需合并库。
通常,这些程序不会出现在 ldd
输出中。
libnss_files
是 libc 的一个组件。它按需加载,用于在静态文件中执行名称查找,如 /etc/passwd
和 /etc/hosts
。 (还有 libnss_dns
用于 DNS 查找。)
有关详细信息,请参阅 NSS (Name Service Switch) 的 libc 文档。