0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何查看linux程序共享库呢?

嵌入式小生 来源:嵌入式小生 2023-08-28 09:11 次阅读

一、开篇

linux系统中,程序通常需要依赖于外部库来正常工作。这些库可以直接编译到程序中,也可以从共享库池中加载。使用共享库有助于减小程序大小,简化开发和打包。在linux中,共享库通常存储在/lib或/usr/lib目录下。

不同的linux发行版甚至同一发行版的版本可能使用不同的库,从而导致一个发行版编译的程序在另一个发行版上运行出现故障。当系统中缺少所需库时,这时可能会遇到错误。在嵌入式linux环境中,库文件更是非常关键,因为嵌入式linux中硬件环境往往具有严苛的限制,太多的库将无法完整放入对应的硬件环境下,所以重新组建linux下的运行库在嵌入式linux设计中是重要的一环操作。

要解决共享库加载的问题,我们可以使用一些工具和命令来确定程序所依赖的共享库,本文将讨论实现这一目标的几种方法。

二、ldd命令

ldd命令用于打印出共享对象的依赖。语法如下:

ldd[选项]文件

可选的参数如下:

--help印出这份说明然后离开
--version印出版本信息然后离开
-d,--data-relocs进程数据重寻址
-r,--function-relocs进程数据和函数重寻址
-u,--unused印出未使用的直接依赖关系
-v,--verbose印出所有信息

例如:

f4d7eef4-4538-11ee-a2ef-92fbcf53809c.png

使用-v可查看更详细的信息:

f50b460a-4538-11ee-a2ef-92fbcf53809c.png

注意,使用ldd命令时可能会导致程序运行,因此不要在不受信任的可执行文件上使用ldd。

三、readelf命令

readelf命令是一个强大的命令,用于显示ELF文件的信息,可使用该命令查看共享库的依赖,方法如下:

readelf--dynamic./app|grepNEEDED

例如下列命令用于查看/usr/bin/dir的依赖库:

f53cbdca-4538-11ee-a2ef-92fbcf53809c.png

四、objdump命令

objdump命令在开发中也是一个较为常用的命令,且功能强大,用于显示对象文件中的信息,可以使用该命令来查看共享库的依赖,方法如下:

objdump-p/path/to/program|grepNEEDED

例如下列命令用于查看/usr/bin/dir的依赖库:

f5561c8e-4538-11ee-a2ef-92fbcf53809c.png

五、pldd命令

f56d723a-4538-11ee-a2ef-92fbcf53809c.png

六、/proc//maps

通过检查/proc//maps来获知运行进程的库需求:

awk'/.so/{print$6}'/proc/$(pgrepbash|head-n1)/maps|sort-u

例如:

f59a249c-4538-11ee-a2ef-92fbcf53809c.png

上述语句中pgrep bash | head -n1表示获取第一个名为bash的进程的ID。

七、使用pmap收集程序的共享库需求

pmap$(pgrepXorg|head-n1)|grep.so|awk'{print$4}'|sort-u

上述语句中pgrep bash | head -n1表示获取第一个名为bash的进程的ID。

八、使用lsof工具检查正在运行的进程的共享库需求

使用方法:

lsof-p$(pgrepbash|head-n1)|grepmem

上述语句中pgrep bash | head -n1表示获取第一个名为bash的进程的ID。

九、总结

在发行版的linux系统中,上述命令几乎都可以使用来查看动态库的依赖关系,在嵌入式linux系统中,可能由于网络环境的限制、运行架构的不同、构建的文件系统中不存在对应的命令程序,从而导致上述一些命令无法运行或者找不到运行的命令,这时候常使用readelf和objdump查看动态库的依赖关系,因为在交叉编译构建工具链中一般会包含readelf和objdump命令的变体。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19111

    浏览量

    304857
  • Linux系统
    +关注

    关注

    4

    文章

    593

    浏览量

    27393
  • ELF文件
    +关注

    关注

    0

    文章

    14

    浏览量

    7134
  • Bash
    +关注

    关注

    0

    文章

    57

    浏览量

    10181

原文标题:八种查看linux程序共享库的方法,了解多少?

文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux系统下查看elf文件的方法

    作为一个嵌入式开发人员,交叉编译是必须进行的步骤。那么,如何判断编译生成的文件(动态,静态,可执行程序)是否符合目标平台的格式?下面分别介绍这 3 种文件的
    的头像 发表于 08-25 16:17 3023次阅读
    <b class='flag-5'>Linux</b>系统下<b class='flag-5'>查看</b>elf文件的方法

    linux共享下,调用共享库函数时,程序卡死在函数中的pid=fork()这里的原因?

    linux共享下,调用共享库函数时,程序卡死在函数中的pid=fork()这里,来个大佬指导指导原因...
    发表于 06-20 06:55

    Linux系统共享编程

    一、说明 类似Windows系统中的动态链接Linux中也有相应的共享用以支持代码的复用。Windows中为*.dll,而Linux
    发表于 09-13 16:49 24次下载

    Linux下静态和动态共享)的制作与使用

    Linux下静态和动态共享)的制作与使用Linux
    发表于 07-09 14:39 1172次阅读

    linux静态和动态分析

    的二进制是不兼容的。 本文仅限于介绍linux下的。 2.的种类 linux下的有两种:静态
    发表于 11-02 10:12 1次下载

    你知道linux 静态共享

    静态链接和动态链接的区别在于,主程序在运行前,静态链接的链接固定写入在程序中,而动态链接
    发表于 04-26 16:46 2898次阅读

    linux共享程序库剖析

    共享程序库通过版本号来完成对应用程序所使用的程序库的升级,同时保留了对原有应用程序的兼容。本文将讨论此方法的实际内幕,以及在
    发表于 04-02 14:35 291次阅读

    Linux下C语言共享的位置无关实现原理分析

    如何创建一个*可执行*的共享 一文谈完了如何让共享可直接执行,本文再来谈谈共享的运行时位置
    的头像 发表于 11-28 16:20 3068次阅读

    如何查看linux端口

    有时我们需要知道系统中某个端口的占用情况,以便于解除程序对端口的占用,那么怎么查看Linux系统中的端口情况
    发表于 05-17 09:45 1847次阅读

    Linux服务的内容如何查看

     ps是进程查看命令,netstat是端口查看命令,在Linux系统中,服务一定是有进程的,所以使用ps命令可以查看服务运行情况,另外,Linux
    发表于 05-20 09:09 751次阅读
    <b class='flag-5'>Linux</b>服务的内容如何<b class='flag-5'>查看</b>

    ldd命令:用于打印程序或者共享文件所依赖的共享列表

    1.命令简介 ldd 命令用于打印程序或者共享文件所依赖的共享列表。注意,ldd 本身不是一个二进制
    的头像 发表于 02-02 11:37 2073次阅读

    C++基础语法知识之链接装载Linux共享

    Linux共享(Shared Library) Linux 下的共享就是普通的 ELF
    的头像 发表于 11-01 10:15 2901次阅读

    Linux程序被Killed,查看原因

    Linux程序被Killed,查看原因
    的头像 发表于 01-11 10:17 2241次阅读

    Linux中的静态共享

    是一个二进制文件,包含的代码可被程序调用。例如标准C、数学、线程等等。有源码,可下载后
    的头像 发表于 05-10 09:34 1034次阅读

    linux查看weblogic进程

    Linux操作系统中,WebLogic是一种常用的Java应用服务器,用于部署和管理企业级Java应用程序。为了确保WebLogic服务器正常运行,有时我们需要查看WebLogic进程以了解其状态
    的头像 发表于 12-05 16:07 1894次阅读