今天在帮同事查看一个问题时, 需要用到ldd, 于是就顺便看了一下ldd的实现. 好在ldd本身只是一个脚本, 而不是executable, 可以直接查看实现的代码.

根据注释:

21 # This is the `ldd' command, which lists what shared libraries are
 22 # used by given dynamically-linked executables.  It works by invoking the
 23 # run-time dynamic linker as a command and setting the environment
 24 # variable LD_TRACE_LOADED_OBJECTS to a non-empty value.

LDD只是设置了LD_TRACE_LOADED_OBJECTS后, 再运行程序或调用/lib/ld-linux.so.2(或/lib64/ld-linux-x86-64.so.2或其他, 取决于系统的architecture等等)来处理动态库, 再将输出分析从而得到整个依赖关系.

于是对于正常的exectuable(以a.out为例)而言, 另一种获得依赖关系列表的方式为:

export LD_TRACE_LOADED_OBJECTS=1
./a.out
输出的结果为:

  1. linux-gate.so.1 => (0xb78b5000)
  2. librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb78a4000)
  3. libselinux.so.1 => /lib/libselinux.so.1 (0xb7889000)
  4. libacl.so.1 => /lib/libacl.so.1 (0xb7880000)
  5. libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7726000)
  6. libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb770d000)
  7. /lib/ld-linux.so.2 (0xb78b6000)
  8. libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7709000)
  9. libattr.so.1 => /lib/libattr.so.1 (0xb7703000)

而对于.so(假设有个liba.so)而言, 另一种获得依赖关系的方式为:
export LD_TRACE_LOADED_OBJECTS=1
/lib/ld-linux.so.2 ./liba.so
输出结果为:

  1. linux-gate.so.1 => (0xb777e000)
  2. libdb-4.8.so => /home/db/opt/dbxml/install/lib/libdb-4.8.so (0xb7360000)
  3. libxqilla.so.5 => /home/db/opt/dbxml/install/lib/libxqilla.so.5 (0xb6f10000)
  4. libxerces-c-3.0.so => /home/db/opt/dbxml/install/lib/libxerces-c-3.0.so (0xb6b6c000)
  5. libz.so.1 => /lib/libz.so.1 (0xb6b51000)
  6. libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6a5b000)
  7. libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb6a35000)
  8. libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb68db000)
  9. libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb68bb000)
  10. libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb68a2000)
  11. libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb688b000)
  12. /lib/ld-linux.so.2 (0xb777f000)

运行中发现貌似/lib/ld-linux.so.2后面的参数是需要带绝对路径或者相对路径的(当前目录则需要用./作为前缀), 目前还不知道ld-linux.so.2是如何确定参数路径的. 当然, 实际上executable也可以用/lib/ld-linux.so.2来获得依赖列表.

实际上/lib/ld-linux.so.2是用来运行程序的. 当执行一个动态链接的程序时, 该工具被自动调用用来获得并解析程序的依赖关系而后执行程序本身. 关于/lib/ld-linux.so.2命令的详情, 参见 http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html

ldd 查看程序/动态库 的依赖的更多相关文章

  1. ubuntu下ldd,查看程序动态库信息

    ldd  list, dynamic, dependencies linux-vdso.so. => (0x00007ffe9d9b6000) libstdc++.so. => /usr/ ...

  2. ldd 查看程序依赖库

    ldd 查看程序依赖库 https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/ldd.html

  3. (转)ldd 查看程序依赖库

    原文:https://blog.csdn.net/u010977122/article/details/52993560?spm=a2c4e.11153940.blogcont551034.8.4f7 ...

  4. Linux和windows 查看程序、进程的依赖库的方法

    Linux: 1. 利用ldd查看可执行程序的依赖库   [root@~]# ldd /usr/local/php/bin/php   linux-vdso.so.1 => (0x00007ff ...

  5. Qt编译时MinGW去掉对gcc动态库的依赖(去掉对libgcc_s_dw2-1.dll,libstdc++-6.dll的依赖)

    用Qt写点东西,我一般是下载官方的MinGW编译工具包,它有个不好的地方,经常还会多一些除了Qt库以外的其它的依赖动态链接库,比如:libgcc_s_dw2-1.dll,libstdc++-6.dll ...

  6. vs查看动态库依赖

    dumpbin是VS自带的工具,进入Visual Studio 的命令提示 查看程序或动态库所依赖的动态库 dumpbin /dependents  abc.exe 查看动态库的输出函数 dumpbi ...

  7. 【转】分析Linux和windows动态库

    原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...

  8. linux静态与动态库创建及使用实例

    一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...

  9. Linux和windows动态库

    转载:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 态链接库技术实现和设计程序常用的技术,在Windows和Linux系 统中 ...

随机推荐

  1. [log4j]Slf4j的包冲突

    Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFa ...

  2. 微信小程序从零开始开发步骤(三)底部导航栏

    上一章节,我们分享了如何创建一个新的页面和设置页面的标题,这一章我们来聊聊底部导航栏是如何实现的.即点击底部的导航,会实现不同对应页面之间的切换. 我们先来看个我们要实现的底部导航栏的效果图:(三个导 ...

  3. AES与RAS结合加解密方案

    import java.io.IOException; import java.security.InvalidKeyException; import java.security.KeyFactor ...

  4. leetcode -day29 Binary Tree Inorder Traversal & Restore IP Addresses

    1.  Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' ...

  5. eclipse个人插件

    1.SVN eclipse markets 安装m2e-subversion.svnkit 2.maven 本地装好mvn prefences导入maven安装目录和配置 3.单元测试覆盖率 EclE ...

  6. 自定义控件学习——下拉刷新ListView

    效果 开始用Android Studio写了,还有挺多不明白这IDE用法的地方....蛋疼 主要思路 1. 添加了自定义的头布局    2. 默认让头布局隐藏setPadding.设置 -自身的高度  ...

  7. python 新模块或者包的安装方法

    主要介绍通过pip自动工具来安装需要的包. 1,先安装pip 下载pip的包(包括setup.py文件) cmd载入到pip本地文件所在路径,使用命令进行安装. python setup.py ins ...

  8. JS match方法的返回数据的探究

    match方法是JS的字符串方法,详细说明可以看MDN的说明. 如果正则表达式匹配成功的话,match方法会返回一个数组,而数组里的数据有两种形式,对应着匹配方式:全局匹配与非全局匹配. 1. 全局匹 ...

  9. BZOJ2780: [Spoj]8093 Sevenk Love Oimaster(广义后缀自动机,Parent树,Dfs序)

    Description Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXu ...

  10. 一个奇怪的Java集合问题

    int size = list.size(); Integer existIndex = -1; for (int index = 0; index < size; index++) { Pho ...