-
ldd
2020-04-25 08:50:58Linux开发实用工具之ldd: 实际项目中程序因缺少某些库文件,而不能正常运行,如何解决这个月都会,ldd就是可以提供帮助Linux开发实用工具之ldd:
实际项目中程序因缺少某些库文件,而不能正常运行,如何解决这个月都会,ldd就是可以提供帮助 -
LDD
2017-11-12 03:10:00[root@m conf]# ldd `which cc` linux-vdso.so.1 => (0x00007fffd41d0000) libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0x00007fbee351b000) libm.so.6 =&g...[root@m conf]# ldd `which cc`
linux-vdso.so.1 => (0x00007fffd41d0000)
libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0x00007fbee351b000)
libm.so.6 => /lib64/libm.so.6 (0x00007fbee3297000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbee2f02000)/lib64/ld-linux-x86-64.so.2 (0x00007fbee380e000)
本文转自 ninnycalf 51CTO博客,原文链接:http://blog.51cto.com/314258/1792021
-
LDD-源码
2021-02-15 10:27:06LDD -
linux中的ldd命令简介
2015-07-26 21:03:34在linux中, 有些命令是大家通用的, 比如ls, rm, mv, cp等等, 这些我觉得没有必要再细说了。 而有些命令, 只有开发人员才会用到的, 这类命令, 作为程序员的我们, 是有...连ldd都不知道, 怎么知道ldd是干啥的呢?在linux中, 有些命令是大家通用的, 比如ls, rm, mv, cp等等, 这些我觉得没有必要再细说了。 而有些命令, 只有开发人员才会用到的, 这类命令, 作为程序员的我们, 是有必要了解的, 有的甚至需要熟练使用。
有的人总说, 这些命令不重要, 用的时候去查就行了, 这么多么扯淡的说法啊。 具体用法细节是可以可查, 但至少得知道有ldd这个东西吧。连ldd都不知道, 怎么知道ldd是干啥的呢?
在本文中, 我们来介绍一下ldd命令, 尽管它非常简单。 哦, 我突然想起来, 我有个朋友, 她的名字的是三个字, 首写字母刚好是l, d, d, 有点意思。 在linux中, ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。 当然, 你也可以用ldd --help或者man ldd来看其用法。 下面, 我们也来看看:
test.h的内容为:
void print();
test.c的内容为:
#include <stdio.h> #include "test.h" void print() { printf("rainy days\n"); }
main.c的内容为:
#include "test.h" int main() { print(); return 0; }
进行一系列的编译, 并用ldd命令, 得到:
[taoge@localhost learn_ldd]$ ls main.c test.c test.h [taoge@localhost learn_ldd]$ gcc -c main.c test.c [taoge@localhost learn_ldd]$ gcc main.o test.o [taoge@localhost learn_ldd]$ ls a.out main.c main.o test.c test.h test.o [taoge@localhost learn_ldd]$ ./a.out rainy days [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ ldd * a.out: linux-gate.so.1 => (0x00ba1000) libc.so.6 => /lib/libc.so.6 (0x0087e000) /lib/ld-linux.so.2 (0x00858000) main.c: ldd: warning: you do not have execution permission for `./main.c' not a dynamic executable main.o: ldd: warning: you do not have execution permission for `./main.o' not a dynamic executable test.c: ldd: warning: you do not have execution permission for `./test.c' not a dynamic executable test.h: ldd: warning: you do not have execution permission for `./test.h' lddlibc4: cannot read header from `./test.h' test.o: ldd: warning: you do not have execution permission for `./test.o' not a dynamic executable [taoge@localhost learn_ldd]$
可以看到a.out依赖于libc.so.6这个库, 而这个库的路径为/lib/libc.so.6
我们继续看使用静态链接库的情形:
[taoge@localhost learn_ldd]$ ls main.c test.c test.h [taoge@localhost learn_ldd]$ gcc -c test.c [taoge@localhost learn_ldd]$ ar rcs libtest.a test.o [taoge@localhost learn_ldd]$ gcc main.c -L. -ltest [taoge@localhost learn_ldd]$ ls a.out libtest.a main.c test.c test.h test.o [taoge@localhost learn_ldd]$ ./a.out rainy days [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ ldd * a.out: linux-gate.so.1 => (0x00e7c000) libc.so.6 => /lib/libc.so.6 (0x0087e000) /lib/ld-linux.so.2 (0x00858000) libtest.a: ldd: warning: you do not have execution permission for `./libtest.a' not a dynamic executable main.c: ldd: warning: you do not have execution permission for `./main.c' not a dynamic executable test.c: ldd: warning: you do not have execution permission for `./test.c' not a dynamic executable test.h: ldd: warning: you do not have execution permission for `./test.h' lddlibc4: cannot read header from `./test.h' test.o: ldd: warning: you do not have execution permission for `./test.o' not a dynamic executable [taoge@localhost learn_ldd]$
这次用静态库, 结果还是差不多, 就没什么好说的了。
我们继续看使用动态链接库时的情形:
[taoge@localhost learn_ldd]$ ls main.c test.c test.h [taoge@localhost learn_ldd]$ gcc -c test.c [taoge@localhost learn_ldd]$ gcc -shared -fPIC -o libtest.so test.o [taoge@localhost learn_ldd]$ gcc main.c -L. -ltest [taoge@localhost learn_ldd]$ ls a.out libtest.so main.c test.c test.h test.o [taoge@localhost learn_ldd]$ ./a.out ./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ ldd * a.out: linux-gate.so.1 => (0x00f3d000) libtest.so => not found libc.so.6 => /lib/libc.so.6 (0x0087e000) /lib/ld-linux.so.2 (0x00858000) libtest.so: linux-gate.so.1 => (0x0031d000) libc.so.6 => /lib/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x00858000) main.c: ldd: warning: you do not have execution permission for `./main.c' not a dynamic executable test.c: ldd: warning: you do not have execution permission for `./test.c' not a dynamic executable test.h: ldd: warning: you do not have execution permission for `./test.h' lddlibc4: cannot read header from `./test.h' test.o: ldd: warning: you do not have execution permission for `./test.o' not a dynamic executable [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ su root Password: [root@localhost learn_ldd]# cp libtest.so /usr/lib/ [root@localhost learn_ldd]# ./a.out rainy days [root@localhost learn_ldd]# exit exit [taoge@localhost learn_ldd]$ ./a.out rainy days [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ [taoge@localhost learn_ldd]$ ldd a.out linux-gate.so.1 => (0x00510000) libtest.so => /usr/libtest.so (0x00fe3000) libc.so.6 => /lib/libc.so.6 (0x0087e000) /lib/ld-linux.so.2 (0x00858000) [taoge@localhost learn_ldd]$
首先, 我们可以看到, a.out依赖于libtest.so这个库, 但是, 结果是not found, 找不到。 为什么呢? 因为在/usr/lib下面没有libtest.so, 后来, 我把libtest.so拷贝过去(需要root权限), 就OK了。 另外, 我们也应该看到, libtest.so的依赖库也是可以通过ldd命令找到的。
当然, 如果不想自己写程序, 但想试一下ldd命令, 那也可以, 直接如下:
[taoge@localhost learn_ldd]$ ldd /bin/ls linux-gate.so.1 => (0x0052b000) libselinux.so.1 => /lib/libselinux.so.1 (0x00b52000) librt.so.1 => /lib/librt.so.1 (0x00a5c000) libcap.so.2 => /lib/libcap.so.2 (0x0489c000) libacl.so.1 => /lib/libacl.so.1 (0x048c9000) libc.so.6 => /lib/libc.so.6 (0x0087e000) libdl.so.2 => /lib/libdl.so.2 (0x00a0c000) /lib/ld-linux.so.2 (0x00858000) libpthread.so.0 => /lib/libpthread.so.0 (0x00a13000) libattr.so.1 => /lib/libattr.so.1 (0x04d99000) [taoge@localhost learn_ldd]$ ldd /bin/mv linux-gate.so.1 => (0x00944000) libselinux.so.1 => /lib/libselinux.so.1 (0x00b52000) librt.so.1 => /lib/librt.so.1 (0x00a5c000) libacl.so.1 => /lib/libacl.so.1 (0x048c9000) libattr.so.1 => /lib/libattr.so.1 (0x04d99000) libc.so.6 => /lib/libc.so.6 (0x00110000) libdl.so.2 => /lib/libdl.so.2 (0x00a0c000) /lib/ld-linux.so.2 (0x00858000) libpthread.so.0 => /lib/libpthread.so.0 (0x00a13000) [taoge@localhost learn_ldd]$
在实际linux开发与调试中, 要经常查看动态库依赖关系, ldd用得还是比较多的, 特别是出现故障的时候。OK, ldd命令就简单介绍到这里了, 虽然简单, 但很实用, 故不可不知。
好了, 今天也写了不少文章了, 就此搁笔。 收拾一下, 看看书, 早点休息, 迎接明天的周一。
-
ldd命令
2019-07-23 19:21:00ldd命令用于打印程序或者库文件所依赖的共享库列表。 语法 ldd(选项)(参数) 选项 --version:打印指令版本号; -v:详细信息模式,打印所有相关信息; -u:打印未使用的直接依赖; -d:执行重定位和报告任何...ldd命令用于打印程序或者库文件所依赖的共享库列表。
语法
ldd(选项)(参数)
选项
--version:打印指令版本号; -v:详细信息模式,打印所有相关信息; -u:打印未使用的直接依赖; -d:执行重定位和报告任何丢失的对象; -r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数; --help:显示帮助信息。
参数
文件:指定可执行程序或者文库。
其他介绍
首先ldd不是一个可执行程序,而只是一个shell脚本
ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:
LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE
等。当LD_TRACE_LOADED_OBJECTS
环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:export LD_TRACE_LOADED_OBJECTS=1
再执行任何的程序,如ls等,看看程序的运行结果。
ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道,ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency。
实际上可以直接执行ld-linux.so模块,如:
/lib/ld-linux.so.2 --list program
(这相当于ldd program) -
ldd 命令
2020-06-18 20:47:24ldd是 list, dynamic, dependencies 的缩写。 列出动态库依赖关系,下图为 ldd *,列出当前目录下所有的动态库的依赖情况。 -
ldd命令 ubuntu_Linux ldd 命令 command not found ldd 命令详解 ldd 命令未找到 ldd 命令安装 - ...
2021-01-17 13:35:43显示行号|选择喜欢的代码风格默认GitHubDuneLakeSidePlateauVibrantBlueEightiesTranquilldd 命令打印程序和库的共享库...ldd 命令安装:-bash: ldd: command not found#Debianapt-get install libc-bin#Ubuntuapt-... -
ldd命令 ubuntu_Linux命令:ldd
2021-01-17 13:35:48zlf@ubuntu:~/$ whichldd/usr/bin/lddzlf@ubuntu:~/$ file /usr/bin/ldd/usr/bin/ldd: Bourne-Again shell script, ASCII text executable2、ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量... -
ldd usr bin mysql_ldd命令
2021-02-06 23:39:00ldd命令用于判断某个可执行的 binary 档案含有什么动态函式库。参数说明:--version 打印ldd的版本号-v --verbose 打印所有信息,例如包括符号的版本信息-d --data-relocs 执行符号重部署,并报告缺少的目标对象(只... -
LDD电子图纸.rar
2020-04-10 19:38:15LDD电子图纸 -
ldd usr bin mysql_ldd与otool
2021-02-06 23:38:59lddldd命令用于打印程序或者库文件所依赖的共享库列表ldd不是一个可执行程序,而只是一个shell脚本golanggo install -buildmode=shared stdgo build -linkshared hi.goLinuxldd /usr/local/bin/openssllinux-vdso.so... -
LDD2+LDD3 linux设备驱动
2011-12-05 22:17:11LDD2+LDD3 linux设备驱动 -
ldd command
2019-04-28 17:49:31ldd命令用于打印程序或者库文件所依赖的共享库列表。 语法 ldd(选项)(参数) 选项 –version:打印指令版本号; -v:详细信息模式,打印所有相关信息; -u:打印未使用的直接依赖; -d:执行重定位和报告任何丢失的... -
ldd3-k5:Linux Kernel 5.x中的LDD3示例-源码
2021-02-18 11:06:07ldd3 Linux内核5.8中的完整示例 -
linux ldd 移植
2020-12-23 11:03:241.什么是ldd 在本文中, 我们来介绍一下ldd命令, 尽管它非常简单。 在linux中, ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。 当然, 你也可以用ldd --help或者man ldd来看其用法。 ... -
Linux ldd
2019-12-01 13:27:51在linux中, ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。 hello.h中的内容 #ifndef HELLO_H #define HELLO_H #include <stdio.h> void HelloFunc(); #endif hello.c中的内容... -
Add ldd.py, a clone of ldd
2020-11-26 05:47:50<div><p>This is useful on systems built with musl (see http://www.musl-libc.org/) which lack an ldd. I am currently working on tests.</p><p>该提问来源于开源项目:eliben/pyelftools</p></div> -
windows使用ldd命令
2020-04-08 13:47:28cmd运行,然后输入ldd.exe 程序.exe 即可查看程序.exe 所依赖的dll文件。
-
ASHRAE 2011 Liquid Cooling Whitepaper.pdf
-
2011年下半年 嵌入式系统设计师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
JOKER.ONE DEFI聚合器 JOKER小丑会不会因为joker雄起?joker是不是值得你去选择?
-
在高密度软件定义的WiFi网络中实现负载平衡
-
2015年下半年 嵌入式系统设计师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
物联网之mqtt实现(emqx+springboot+mqtt附源码)
-
从理论到试验台,WiFi DCF网络的性能评估
-
FPS游戏逆向-UE4虚幻四游戏逆向
-
springcloud-gateway源码-(十)Ribbon负载均衡导图
-
Jsplumb从入门到实战
-
异常色散光纤激光器中的线性耗散孤子
-
Leetcode-867 转置矩阵
-
歌声合成从入门到精通
-
MySQL你该了解的那些事【服务端篇】
-
2021 PHP租车系统 毕业设计 毕设源码 源代码使用教程
-
uni-app项目 小程序发布
-
【硬核】一线Python程序员实战经验分享(1)
-
洛谷P5726 【深基4.习9】打分经典解法
-
Java实现基数排序算法
-
洛谷P5725 【深基4.习8】求三角形经典解法