/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 仅依赖于 libcld。 然而,在真实的 运行 时间环境中,/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 文档。