ldd 查看程序/动态库 的依赖
今天在帮同事查看一个问题时, 需要用到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
输出的结果为:
- linux-gate.so.1 => (0xb78b5000)
- librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb78a4000)
- libselinux.so.1 => /lib/libselinux.so.1 (0xb7889000)
- libacl.so.1 => /lib/libacl.so.1 (0xb7880000)
- libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7726000)
- libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb770d000)
- /lib/ld-linux.so.2 (0xb78b6000)
- libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7709000)
- libattr.so.1 => /lib/libattr.so.1 (0xb7703000)
而对于.so(假设有个liba.so)而言, 另一种获得依赖关系的方式为:
export LD_TRACE_LOADED_OBJECTS=1
/lib/ld-linux.so.2 ./liba.so
输出结果为:
- linux-gate.so.1 => (0xb777e000)
- libdb-4.8.so => /home/db/opt/dbxml/install/lib/libdb-4.8.so (0xb7360000)
- libxqilla.so.5 => /home/db/opt/dbxml/install/lib/libxqilla.so.5 (0xb6f10000)
- libxerces-c-3.0.so => /home/db/opt/dbxml/install/lib/libxerces-c-3.0.so (0xb6b6c000)
- libz.so.1 => /lib/libz.so.1 (0xb6b51000)
- libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6a5b000)
- libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb6a35000)
- libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb68db000)
- libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb68bb000)
- libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb68a2000)
- libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb688b000)
- /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 查看程序/动态库 的依赖的更多相关文章
- ubuntu下ldd,查看程序动态库信息
ldd list, dynamic, dependencies linux-vdso.so. => (0x00007ffe9d9b6000) libstdc++.so. => /usr/ ...
- ldd 查看程序依赖库
ldd 查看程序依赖库 https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/ldd.html
- (转)ldd 查看程序依赖库
原文:https://blog.csdn.net/u010977122/article/details/52993560?spm=a2c4e.11153940.blogcont551034.8.4f7 ...
- Linux和windows 查看程序、进程的依赖库的方法
Linux: 1. 利用ldd查看可执行程序的依赖库 [root@~]# ldd /usr/local/php/bin/php linux-vdso.so.1 => (0x00007ff ...
- Qt编译时MinGW去掉对gcc动态库的依赖(去掉对libgcc_s_dw2-1.dll,libstdc++-6.dll的依赖)
用Qt写点东西,我一般是下载官方的MinGW编译工具包,它有个不好的地方,经常还会多一些除了Qt库以外的其它的依赖动态链接库,比如:libgcc_s_dw2-1.dll,libstdc++-6.dll ...
- vs查看动态库依赖
dumpbin是VS自带的工具,进入Visual Studio 的命令提示 查看程序或动态库所依赖的动态库 dumpbin /dependents abc.exe 查看动态库的输出函数 dumpbi ...
- 【转】分析Linux和windows动态库
原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...
- linux静态与动态库创建及使用实例
一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...
- Linux和windows动态库
转载:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 态链接库技术实现和设计程序常用的技术,在Windows和Linux系 统中 ...
随机推荐
- java高质量缩放图片
可按照比例缩放,也可以指定宽高 import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg.JP ...
- shell项目-告警系统
告警系统 1. 告警系统需求分析 需求:使用shell定制各种个性化告警工具,但需要统一化管理.规范化管理. 思路:指定一个脚本包,包含主程序.子程序.配置文件.邮件引擎.输出日志等. 主程序:作为整 ...
- cat---查看文件内容
- CodeForces 159c String Manipulation 1.0
String Manipulation 1.0 Time Limit: 3000ms Memory Limit: 262144KB This problem will be judged on Cod ...
- 洛谷 P1881 绳子对折
P1881 绳子对折 题目描述 FJ 有一个长度为L(1<= L <= 10,000)的绳子. 这个绳子上有N(1 <= N <= 100)个结,包括两个端点. FJ想将绳子对 ...
- Matlab piecelin
function v = piecelin(x,y,u) %PIECELIN Piecewise linear interpolation. % v = piecelin(x,y,u) finds t ...
- HDU 1166 敌兵布阵 Segment Tree题解
本题是最主要的分段树操作了.或者一般叫线段树,只是好像和线段没什么关系,仅仅是分段了. 不使用lazy标志,更新仅仅是更新单点. 假设不使用分段树,那么更新时间效率仅仅须要O(1),使用分段树更新效率 ...
- Nginx系列(一)--nginx是什么?
一.介绍 Nginx是一个高性能的HTTP和反向代理server,也是一个IMAP/POP3/SMTP代理server. Nginx是一款轻量级的Webserver/反向代理server以及电子邮件代 ...
- Android学习笔记进阶17之LinearGradient
具体的看一下博文:Android学习笔记进阶15之Shader渲染 package xiaosi.BitmapShader; import android.app.Activity; import a ...
- stm32与arm7比较(经典)
http://wenku.baidu.com/link?url=LIVcT1AQL0IgVF1xan5Zy9rXarCBo66hj7OXSxM1ap7FpssO4c3sd1pZd8azfBPr3PBy ...