当前位置:首页 > 编程笔记 > 正文
已解决

Linux查看程序和动态库依赖的动态库

来自网友在路上 144844提问 提问时间:2023-09-26 21:54:53阅读次数: 44

最佳答案 问答题库448位专家为你答疑解惑

一. 前言

        在一些时候,我们需要知道一个程序或者动态库所依赖的动态库有哪些。比如,当我们运行一个程序的时候,发现可能会报错,提示找不到某个符号,这时我们就需要知道程序依赖了什么库,从而添加对应需要的动态库。等等,接下来介绍两种方法查看程序和动态库所依赖的动态库。

二. 方法介绍

1. 使用objdump命令
objdump -p FILE

        objdump命令加上"-p"选项可以打印程序的头部信息,包含各个段的信息和符号表的信息,其中,段信息中会有一个NEEDED字段,表示程序需要依赖的动态库,案例如下:

[root@localhost code]# objdump -p json-c/test1json-c/test1:     file format elf64-x86-64Program Header:PHDR off    0x0000000000000040 vaddr 0x0000000000400040 paddr 0x0000000000400040 align 2**3filesz 0x00000000000001f8 memsz 0x00000000000001f8 flags r-xINTERP off    0x0000000000000238 vaddr 0x0000000000400238 paddr 0x0000000000400238 align 2**0filesz 0x000000000000001c memsz 0x000000000000001c flags r--LOAD off    0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**21filesz 0x0000000000000fd4 memsz 0x0000000000000fd4 flags r-xLOAD off    0x0000000000001e00 vaddr 0x0000000000601e00 paddr 0x0000000000601e00 align 2**21filesz 0x00000000000002ac memsz 0x00000000000002b0 flags rw-DYNAMIC off    0x0000000000001e18 vaddr 0x0000000000601e18 paddr 0x0000000000601e18 align 2**3filesz 0x00000000000001e0 memsz 0x00000000000001e0 flags rw-NOTE off    0x0000000000000254 vaddr 0x0000000000400254 paddr 0x0000000000400254 align 2**2filesz 0x0000000000000044 memsz 0x0000000000000044 flags r--
EH_FRAME off    0x0000000000000eac vaddr 0x0000000000400eac paddr 0x0000000000400eac align 2**2filesz 0x0000000000000034 memsz 0x0000000000000034 flags r--STACK off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-RELRO off    0x0000000000001e00 vaddr 0x0000000000601e00 paddr 0x0000000000601e00 align 2**0filesz 0x0000000000000200 memsz 0x0000000000000200 flags r--Dynamic Section:NEEDED               libjson-c.so.4NEEDED               libc.so.6INIT                 0x00000000004008f8FINI                 0x0000000000400e24INIT_ARRAY           0x0000000000601e00INIT_ARRAYSZ         0x0000000000000008FINI_ARRAY           0x0000000000601e08FINI_ARRAYSZ         0x0000000000000008GNU_HASH             0x0000000000400298STRTAB               0x0000000000400510SYMTAB               0x00000000004002d0STRSZ                0x00000000000001c9SYMENT               0x0000000000000018DEBUG                0x0000000000000000PLTGOT               0x0000000000602000PLTRELSZ             0x00000000000001b0PLTREL               0x0000000000000007JMPREL               0x0000000000400748RELA                 0x0000000000400730RELASZ               0x0000000000000018RELAENT              0x0000000000000018VERNEED              0x0000000000400710VERNEEDNUM           0x0000000000000001VERSYM               0x00000000004006daVersion References:required from libc.so.6:0x09691a75 0x00 02 GLIBC_2.2.5

        由上面程序的NEEDED可知,test1程序依赖libjson-c.so.4libc.so.6程序,所以,使用objdump命令查看程序依赖的动态库的命令就很简单了,如下:

objdump -p json-c/test1 | grep NEEDED
2. 使用ldd命令

        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命令,这在我们开发工作中提供便利,加快我们的开发效率。

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"Linux查看程序和动态库依赖的动态库":http://eshow365.cn/6-14189-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!