linux中的ldd命令简介

linux中的ldd命令简介在linux中,有些命令是大家通用的,比如ls,rm,mv,cp等等,这些我觉得没有必要再细说了。而有些命令,只有开发人员才会用到的,这类命令,作为程序员的我们,是有必要了解的,有的甚至需要熟练使用。有的人总说,这些命令不重要,用的时候去查就行了,这么多么扯淡的说法啊。具体用法细节是可以可查,但至少得知道有ldd这个东西吧。连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命令就简单介绍到这里了, 虽然简单, 但很实用, 故不可不知。

 

 

        好了, 今天也写了不少文章了, 就此搁笔。 收拾一下, 看看书, 早点休息, 迎接明天的周一。

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130183.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 华为P40怎么解账号锁P40Pro忘记密码ID账号锁解除方案开机设备解锁帐号软件使用方法

    华为P40怎么解账号锁P40Pro忘记密码ID账号锁解除方案开机设备解锁帐号软件使用方法​今天带来一台用户华为mate30手机强制清除华为账号锁案例分享,这个台手机是用户公司手机,由于前使用者离职后未能退出手机的华为账号和锁屏密码,导致手机无法使用。自己通过简单的恢复出厂设置后,发现手机有华为账号锁无法激活手机,这才联系到刷机爱好者技术人员,给予远程强制刷机移除华为mate30的账号锁。在此提醒广大用户,登录的华为账号建议绑定经常使用的手机号码,防止无法找回密码从而到时手机无法使用。在刷机解锁过程中需要准备以下工具:准备windwos系统电脑一台,有条件的用户可以找台配置.

  • docker端口映射成功 不可用_docker启动后访问拒绝连接

    docker端口映射成功 不可用_docker启动后访问拒绝连接情境描述创建一个docker容器,并进行端口映射。容器启动后,在部署容器的主机上可以访问映射端口,但是其他主机无法访问。问题排查出现上述情况,应是请求被拦截。出现该问题的可能是由于firewall配置异常、ip转发关闭、iptables服务拦截了请求排查firewall(1)使用firewall-cmd–state查看防火墙运行情况如果防火墙处于notrunning,则可以排除…

    2022年10月17日
  • linux下ll命令_ubuntu bash命令

    linux下ll命令_ubuntu bash命令ubuntull命令1、用过Redhat或者Centos的朋友应该很熟悉ll这个命令,就相当于ls-l,但在Ubuntu中要么不能用,要么会显示隐藏文件,看起来很烦。2、严格来说ll不是一个命令,只是命令的别名而已。很多Linux用户都使用bashshell,对普通用户来说用得最多的就是命令补全(按tab键)和alias(别名)功能。Ubunt…

  • mysql中左连接查询_mysql左连接「建议收藏」

    mysql中左连接查询_mysql左连接「建议收藏」1.on后面的条件和where后面的条件的区别查询语句开始会根据on后面的条件创建一张虚拟表,左边表是全部数据,右边表会根据on后面的条件进行筛选。然后再根据where后面的条件进行筛选虚拟表中的数据作为最终数据所以如果是筛选右表中的条件放在了where中则则会过滤掉部分左表中的数据结论:筛选右表的条件和左右表关联的条件写在on中筛选左表的条件写在where中2.右表中的条件放在…

  • matlab中矩阵的秩,matlab矩阵的秩

    matlab中矩阵的秩,matlab矩阵的秩如下所示为一方阵在matlab输入矩阵:A=[124;407913];2.2查阅matlabhelp可以知道,利用eig函数可以快速求解矩阵的特征值与特征……Matlab矩阵分析与处理_理学_高等教育_教育专区。1、单位矩阵,随机矩阵,零矩阵和对角阵2、产生5阶希尔伯特矩阵H和5阶帕斯卡矩阵P,且求其行列式的值Hh和Hp以及它们……结构数…

  • bug与漏洞

    bug与漏洞

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号