Why /proc/<pid>/maps shows more shared library than ldd program?
Here's an example:
# ------------ 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 is used to check if the files are the same. From PC side ldd cross-tool, it shows busybox depends on libc and ld only. However, in the real run-time environment, /proc/132/maps shows one more shared library, /lib/libnss_files-2.22.so.
To confirm if we have indirect dependency:
$ /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 No. ldd show that libc depends on ld, which is already one of busybox's dependency.