在一些时候,我们需要知道一个程序或者动态库所依赖的动态库有哪些。比如,当我们运行一个程序的时候,发现可能会报错,提示找不到某个符号,这时我们就需要知道程序依赖了什么库,从而添加对应需要的动态库。等等,接下来介绍两种方法查看程序和动态库所依赖的动态库。
objdump -p FILE
objdump命令加上"-p"选项可以打印程序的头部信息,包含各个段的信息和符号表的信息,其中,段信息中会有一个NEEDED字段,表示程序需要依赖的动态库,案例如下:
- [root@localhost code]# objdump -p json-c/test1
-
- json-c/test1: file format elf64-x86-64
-
- Program Header:
- PHDR off 0x0000000000000040 vaddr 0x0000000000400040 paddr 0x0000000000400040 align 2**3
- filesz 0x00000000000001f8 memsz 0x00000000000001f8 flags r-x
- INTERP off 0x0000000000000238 vaddr 0x0000000000400238 paddr 0x0000000000400238 align 2**0
- filesz 0x000000000000001c memsz 0x000000000000001c flags r--
- LOAD off 0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**21
- filesz 0x0000000000000fd4 memsz 0x0000000000000fd4 flags r-x
- LOAD off 0x0000000000001e00 vaddr 0x0000000000601e00 paddr 0x0000000000601e00 align 2**21
- filesz 0x00000000000002ac memsz 0x00000000000002b0 flags rw-
- DYNAMIC off 0x0000000000001e18 vaddr 0x0000000000601e18 paddr 0x0000000000601e18 align 2**3
- filesz 0x00000000000001e0 memsz 0x00000000000001e0 flags rw-
- NOTE off 0x0000000000000254 vaddr 0x0000000000400254 paddr 0x0000000000400254 align 2**2
- filesz 0x0000000000000044 memsz 0x0000000000000044 flags r--
- EH_FRAME off 0x0000000000000eac vaddr 0x0000000000400eac paddr 0x0000000000400eac align 2**2
- filesz 0x0000000000000034 memsz 0x0000000000000034 flags r--
- STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4
- filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
- RELRO off 0x0000000000001e00 vaddr 0x0000000000601e00 paddr 0x0000000000601e00 align 2**0
- filesz 0x0000000000000200 memsz 0x0000000000000200 flags r--
-
- Dynamic Section:
- NEEDED libjson-c.so.4
- NEEDED libc.so.6
- INIT 0x00000000004008f8
- FINI 0x0000000000400e24
- INIT_ARRAY 0x0000000000601e00
- INIT_ARRAYSZ 0x0000000000000008
- FINI_ARRAY 0x0000000000601e08
- FINI_ARRAYSZ 0x0000000000000008
- GNU_HASH 0x0000000000400298
- STRTAB 0x0000000000400510
- SYMTAB 0x00000000004002d0
- STRSZ 0x00000000000001c9
- SYMENT 0x0000000000000018
- DEBUG 0x0000000000000000
- PLTGOT 0x0000000000602000
- PLTRELSZ 0x00000000000001b0
- PLTREL 0x0000000000000007
- JMPREL 0x0000000000400748
- RELA 0x0000000000400730
- RELASZ 0x0000000000000018
- RELAENT 0x0000000000000018
- VERNEED 0x0000000000400710
- VERNEEDNUM 0x0000000000000001
- VERSYM 0x00000000004006da
-
- Version References:
- required from libc.so.6:
- 0x09691a75 0x00 02 GLIBC_2.2.5
由上面程序的NEEDED可知,test1程序依赖libjson-c.so.4和libc.so.6程序,所以,使用objdump命令查看程序依赖的动态库的命令就很简单了,如下:
objdump -p json-c/test1 | grep NEEDED
ldd命令是专门用来打印程序和动态库所依赖的动态库的,命令如下:
ldd [OPTION]... FILE...
ldd命令后面直接跟上文件名就可以了,案例如下:
- # ldd json-c/test1
- linux-vdso.so.1 => (0x00007fffccfc2000)
- libjson-c.so.4 => /lib/libjson-c.so.4 (0x00007f28fcfd7000)
- libc.so.6 => /lib64/libc.so.6 (0x00007f28fcc09000)
- /lib64/ld-linux-x86-64.so.2 (0x00007f28fd1e6000)
如上可以看出,ldd直接打印出了test1程序所依赖的动态库。
本文介绍了两种查看程序和动态库所依赖的动态库的方法,分别是objdump -p和ldd命令,这在我们开发工作中提供便利,加快我们的开发效率。