1 问题背景

最近有个项目需要将libwebp这个库的source code移植到linux 平台下,因为只需要部分功能,所以对代码进行了精简。精简过后可以编译通过,so加载到开发板上却无法实现对应的功能,也没有报出明显的错误。因为之前有遇到过引用了没有声明或者没有实现的函数导致so不能使用的情况,所以怀疑精简的时候出了问题,导致误删除了一些函数。
百度了一下linux 平台上如何查看so依赖的函数或者lib 是否有缺失方法,出现了ldd 这个命令,执行以下shell命令即可查看目标so依赖了哪些lib或函数,同时可以查看依赖项是否有缺失。

ldd -r xxx.so

执行后输出如下log,发现移植libwebp的so有一些undefined symbol error,应该是没有定义、函数没有实现或者是头文件没有引用等。

[15:17:30.658]undefined symbol: WebPUnfilters (./xxx.so)
[15:17:30.658]undefined symbol: WebPRescalerExportRow (./xxx.so)
[15:17:30.658]undefined symbol: WebPRescalerDspInit   (./xxx.so)
[15:17:30.658]undefined symbol: WebPRescalerImportRow (./xxx.so)
[15:17:30.658]undefined symbol: VP8FiltersInit        (./xxx.so)

对照了error项所指的函数,逐一排查,最终完美解决该问题。鉴于该命令的强大之处,于是想再深入了解一下该命令的用法。

2 ldd命令的详细用法

linux平台下想要知道某个shell命令的方法很简单,用man + 命令就可以看到该命令的用法。

man ldd

摘出了一些有用的信息:

LDD(1)                                                                                 Linux Programmer's Manual                                                                                LDD(1)NAMEldd - print shared object dependenciesSYNOPSISldd [option]... file...DESCRIPTIONldd prints the shared objects (shared libraries) required by each program or shared object specified on the command line.  An example of its use and output is the following:$ ldd /bin/lslinux-vdso.so.1 (0x00007ffcc3563000)libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f87e5459000)libcap.so.2 => /lib64/libcap.so.2 (0x00007f87e5254000)libc.so.6 => /lib64/libc.so.6 (0x00007f87e4e92000)libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f87e4c22000)libdl.so.2 => /lib64/libdl.so.2 (0x00007f87e4a1e000)/lib64/ld-linux-x86-64.so.2 (0x00005574bf12e000)libattr.so.1 => /lib64/libattr.so.1 (0x00007f87e4817000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f87e45fa000)In  the  usual case, ldd invokes the standard dynamic linker (see ld.so(8)) with the LD_TRACE_LOADED_OBJECTS environment variable set to 1.  This causes the dynamic linker to inspect the pro‐gram's dynamic dependencies, and find (according to the rules described in ld.so(8)) and load the objects that satisfy those dependencies.  For each dependency, ldd displays the  location  ofthe matching object and the (hexadecimal) address at which it is loaded.  (The linux-vdso and ld-linux shared dependencies are special; see vdso(7) and ld.so(8).)OPTIONS--versionPrint the version number of ldd.-v, --verbosePrint all information, including, for example, symbol versioning information.-u, --unusedPrint unused direct dependencies.  (Since glibc 2.3.4.)-d, --data-relocsPerform relocations and report any missing objects (ELF only).-r, --function-relocsPerform relocations for both data objects and functions, and report any missing objects or functions (ELF only).--help Usage information.

DESCRIPTION里说明了ldd命令用于打印指定的程序或so所需的so,并且有详细的示例。
OPTIONS里有一系列选项,含义分别如下所示:

--version:打印指令版本号;
-v:详细信息模式,打印所有相关信息;
-u:打印未使用的直接依赖;
-d:执行重定位和报告任何丢失的对象;
-r:对数据对象和函数执行重新定位,并报告任何缺少的对象或函数(仅限ELF)。;
--help:显示帮助信息。

可以看出,查看so的依赖是否有缺失使用-r参数即可。

linux ldd命令的使用相关推荐

  1. 【Linux】一步一步学Linux——ldd命令(251)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 其它描述 06. 附录 01. 命令概述 ldd命令用于打印程序或者库文件所依赖的 ...

  2. linux ldd命令源代码,Linux中ldd命令的用法详解

    Linux中ldd命令主要用于查看程式运行所需的共享库,那么ldd命令具体要如何使用呢?下面小编就给大家介绍下Linux下ldd命令的使用方法,感兴趣的朋友一起来学习下吧. ldd命令用于判断某个可执 ...

  3. ldd命令 ubuntu_技术|简单介绍 ldd 命令

    如果您的工作涉及到 Linux 中的可执行文件和共享库的知识,则需要了解几种命令行工具.其中之一是 ldd ,您可以使用它来访问共享对象依赖关系.在本教程中,我们将使用一些易于理解的示例来讨论此实用程 ...

  4. linux常用命令之lsof 、netstat、ipcs、ldd

    一.lsof lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.每行 ...

  5. 【Linux】19.Linux环境变量名LD_LIBRARY_PATH 和 ldd命令详解

    Linux环境变量名LD_LIBRARY_PATH 和 ldd命令详解 参考链接: https://www.jianshu.com/p/a62e1d327023 LD_LIBRARY_PATH中的LD ...

  6. Linux下nm和ldd 命令

    1. Linux nm 命令 nm ['-a'|'--debug-syms'] ['-g'|'--extern-only'] ['-B'] ['-C'|'--demangle'[=style]] [' ...

  7. Linux 命令(61)—— ldd 命令

    1.命令简介 ldd 命令用于打印程序或者共享库文件所依赖的共享库列表.注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 wh ...

  8. linux的so命令,每天一个 Linux 命令(67): ldd 命令

    原标题:每天一个 Linux 命令(67): ldd 命令 ldd 命令用于打印程序或者共享库文件所依赖的共享库列表. 注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 ...

  9. gl linux qt 库_Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)

    最近一直在学习Qt,用Qt写了一个程序,但是不知道怎么发布,网上说的都是在windows下怎么发布Qt应用程序,但是,在windows下Qt应用程序依赖的库文件与linux下的名字不同.于是,我就想到 ...

最新文章

  1. 11.如何在非固定大小的地图图片上正确渲染ROS小车的位置和运行轨迹
  2. 《python3网络爬虫开发实战》--基本库的使用
  3. oracle重建控制文件流程,ORACLE之重建控制文件
  4. 运行第一个docker容器
  5. 【详细解析】1033 To Fill or Not to Fill (25 分)
  6. c++ lua 可以做什么_Redis令牌桶算法(全网最全,后续可以接入lua做原子性操作)...
  7. Atitit.多媒体区----web视频格式的选择总结
  8. 【工具相关】web-HTML/CSS/JS Prettify的使用
  9. Centos7安装MariaDB10.28稳定版
  10. 支持专业设计师的高端样机素材网
  11. [转]解读2014之前端篇:任性的颠覆式改变
  12. php资源文件html,nginx 同一域名下分目录配置显示php,html,资源文件
  13. 导出csv文件数字会自动变科学计数法的解决方式
  14. JavaScript 游戏开发包-收集
  15. 物理学步入禅境,缘起性空
  16. C/C++ 二维数组传参方法总结
  17. linux 未分配分区合并,这种情况如何扩展硬盘,合并硬盘分区,主分盘和未分配中间有个恢復分区,不能合并扩展硬盘!...
  18. 全景图的种类、360度三维实拍全景
  19. MATLAB 人机对弈黑白棋
  20. 【第十四篇】Flowable事件-错误事件

热门文章

  1. 深入剖析ASP.NET 2.0缓冲机制
  2. OSChina 周三乱弹 ——来自绿帽子的逆袭
  3. 高考结束~~发泄一下~~
  4. python+Word2Vec实现中文聊天机器人
  5. 什么是伪静态?伪静态有何作用?
  6. 海康威视iVMS综合安防系统任意文件上传漏洞复现 (0day)
  7. 代码审计-dubbo admin =2.6.1远程命令执行漏洞
  8. 【Spring5】Spring项目运行时报错:IOException parsing XML document from class path resource [bean.xml]
  9. IDEO HCD Toolkit 中文翻译版
  10. Python: 1041 考试座位号