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

2023-09-18 19:33:01

一. 前言

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

二. 方法介绍

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

更多推荐

使用Java中SSM技术写项目具体操作流程

确定需求和技术选型首先需要明确项目的功能需求,以及选择合适的技术框架和库。在SSM框架中,Spring框架负责管理Java对象,提供依赖注入和面向切面编程的功能;SpringMVC框架负责处理请求和响应,实现MVC架构;MyBatis框架负责ORM(对象关系映射),简化数据库操作。创建SpringMVC工程使用Mave

算法与设计分析--分治算法的设计与分析

某不知名学校的第二次算法实验报告,一共四道题全部来自力扣第一题​​​​​​169.多数元素题目描述:给定一个大小为n的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊n/2⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入:[3,2,3]输出:3示例2:输入:[2,2,1,1,1

基于springboot会员制医疗预约服务管理信息系统springboot017

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路,向着优秀程序员前行!🍅更多优质项目👇🏻👇🏻可点击下方获取🍅文章底部或评论区获取🍅Java项目精品实

CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)

A.MEXanizedArrayAC代码:#include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=210;inta[N];intn,k,x;voidsolve(){cin>>n>>k>>x;if(x<k-1){c

vue-cli-service build 不同环境的配置

目录🤜背景🤜vue-cli-service介绍🤜环境变量和模式🤜配置不同模式🤜index.html使用环境变量🤜验证🤜参考资料🤜背景在项目部署时,我们需要在测试环境和生产环境使用不同的变量。vue-cli提供了vue-cli-servicebuild打包命令,然而vue-cli-servicebuild

如何安装 Wnmp 并结合内网穿透实现外网访问内网Wnmp 服务

文章目录前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1注册账号3.2下载cpolar客户端3.3登录cpolarwebui管理界面3.4创建公网地址4.固定公网地址访问前言WNMP是Windows系统下的绿色Nginx+Mysql+PHP环境集成套件包,安装完成后即可得到一个Nginx+My

APP广告变现策略:如何实现盈利与用户体验的平衡?

如何把握流量变现和用户体验的平衡呢?这是许多APP开发者在商业化进程中都会关心并迫切需要解决的问题。以下是总结的一些方法和策略。一、深入了解用户需求在开发产品或进行商业决策时,我们要始终以用户需求为出发点。通过市场调研、用户调研和数据分析等方式,我们可以深入了解用户的需求和习惯,并以此为基础进行产品设计和优化。二、优化

文案内容千篇一律,软文推广如何加深用户印象

随着互联网技术的发展,企业营销的方式逐渐转向软文推广,但是现在软文推广的内容同质化越来越严重,企业应该如何让自己的软文推广保持差异性,在用户心中留下独特的印象呢?下面就让媒介盒子告诉你。一、&nbsp;找出产品独特卖点市场上同一类型的产品,缺点各有各的不同,但优点大同小异,因此我们需要找出产品独特卖点,将其表现出来,在

能进大厂?阿里云ACE认证到底有多香!

中国云计算火爆的当下,阿里云一枝独秀,市场占有率比排名后5名的总和还要多。在全球的云计算市场上,阿里云也是排名第三,超过谷歌云。这足以说明了市场对于阿里云产品解决方案的需求之大。而阿里云云计算架构师ACE认证是针对云架构师,解决方案架构师,云运维专家等技术人员的阿里云高级别技术认证。该认证体系已被阿里巴巴集团、交付伙伴

安卓恶意应用识别(三)(批量反编译与属性值提取)

前言上篇说到对安卓APK反编译,本篇实现批量反编译和批量特征提取及计算,主要就是通过python代码与cmd进行批量化交互,我在写文章之前,尝试批量下载了安卓apk(大约10来个),发现现在这个应用软件不是一般的大啊,无奈电脑内存不太够,现仅将已下载10个apk作为示例展示。1.批量反编译思路是这样:第一步:调用cmd

一文熟悉Latex论文排版

相信计算机专业或者写过专业论文的同学都知道,使用Office或者WPS来控制论文的格式有多么复杂和繁琐,甚至有时候花在改论文格式上的时间甚至超过了写论文的时间,因此我们急需要使用一种更加专业实用的排版工具来满足我们的论文排版需求,因此,Latex应运而生!1.LaTex概述LaTex是一个专业的排版工具,LaTex在世

热文推荐