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


    一. 前言

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

    二. 方法介绍

    1. 使用objdump命令
    objdump -p FILE

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

    1. [root@localhost code]# objdump -p json-c/test1
    2. json-c/test1: file format elf64-x86-64
    3. Program Header:
    4. PHDR off 0x0000000000000040 vaddr 0x0000000000400040 paddr 0x0000000000400040 align 2**3
    5. filesz 0x00000000000001f8 memsz 0x00000000000001f8 flags r-x
    6. INTERP off 0x0000000000000238 vaddr 0x0000000000400238 paddr 0x0000000000400238 align 2**0
    7. filesz 0x000000000000001c memsz 0x000000000000001c flags r--
    8. LOAD off 0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**21
    9. filesz 0x0000000000000fd4 memsz 0x0000000000000fd4 flags r-x
    10. LOAD off 0x0000000000001e00 vaddr 0x0000000000601e00 paddr 0x0000000000601e00 align 2**21
    11. filesz 0x00000000000002ac memsz 0x00000000000002b0 flags rw-
    12. DYNAMIC off 0x0000000000001e18 vaddr 0x0000000000601e18 paddr 0x0000000000601e18 align 2**3
    13. filesz 0x00000000000001e0 memsz 0x00000000000001e0 flags rw-
    14. NOTE off 0x0000000000000254 vaddr 0x0000000000400254 paddr 0x0000000000400254 align 2**2
    15. filesz 0x0000000000000044 memsz 0x0000000000000044 flags r--
    16. EH_FRAME off 0x0000000000000eac vaddr 0x0000000000400eac paddr 0x0000000000400eac align 2**2
    17. filesz 0x0000000000000034 memsz 0x0000000000000034 flags r--
    18. STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4
    19. filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
    20. RELRO off 0x0000000000001e00 vaddr 0x0000000000601e00 paddr 0x0000000000601e00 align 2**0
    21. filesz 0x0000000000000200 memsz 0x0000000000000200 flags r--
    22. Dynamic Section:
    23. NEEDED libjson-c.so.4
    24. NEEDED libc.so.6
    25. INIT 0x00000000004008f8
    26. FINI 0x0000000000400e24
    27. INIT_ARRAY 0x0000000000601e00
    28. INIT_ARRAYSZ 0x0000000000000008
    29. FINI_ARRAY 0x0000000000601e08
    30. FINI_ARRAYSZ 0x0000000000000008
    31. GNU_HASH 0x0000000000400298
    32. STRTAB 0x0000000000400510
    33. SYMTAB 0x00000000004002d0
    34. STRSZ 0x00000000000001c9
    35. SYMENT 0x0000000000000018
    36. DEBUG 0x0000000000000000
    37. PLTGOT 0x0000000000602000
    38. PLTRELSZ 0x00000000000001b0
    39. PLTREL 0x0000000000000007
    40. JMPREL 0x0000000000400748
    41. RELA 0x0000000000400730
    42. RELASZ 0x0000000000000018
    43. RELAENT 0x0000000000000018
    44. VERNEED 0x0000000000400710
    45. VERNEEDNUM 0x0000000000000001
    46. VERSYM 0x00000000004006da
    47. Version References:
    48. required from libc.so.6:
    49. 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命令后面直接跟上文件名就可以了,案例如下:

    1. # ldd json-c/test1
    2. linux-vdso.so.1 => (0x00007fffccfc2000)
    3. libjson-c.so.4 => /lib/libjson-c.so.4 (0x00007f28fcfd7000)
    4. libc.so.6 => /lib64/libc.so.6 (0x00007f28fcc09000)
    5. /lib64/ld-linux-x86-64.so.2 (0x00007f28fd1e6000)

            如上可以看出,ldd直接打印出了test1程序所依赖的动态库。

    三. 总结

            本文介绍了两种查看程序和动态库所依赖的动态库的方法,分别是objdump -p和ldd命令,这在我们开发工作中提供便利,加快我们的开发效率。

  • 相关阅读:
    DPDK&VPP关键技术文档总结
    Elasticsearch同义词最佳实践
    LeetCode 双周赛 99,纯纯送分场!
    【移动端h5常用的几款插件 】
    【leetcode】链表的中间节点
    c++ 11:二叉树练习
    Magica Cloth 使用方法笔记
    Rockchip Clock
    JMeter笔记7 | JMeter脚本回放
    redis info 详解(InsCode AI 创作助手)
  • 原文地址:https://blog.csdn.net/to_be_better_wen/article/details/132991905