linux中的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 foundlibc.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/lslinux-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/mvlinux-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命令就简单介绍到这里了, 虽然简单, 但很实用, 故不可不知。
好了, 今天也写了不少文章了, 就此搁笔。 收拾一下, 看看书, 早点休息, 迎接明天的周一。
linux中的ldd命令简介相关推荐
- linux dmesg信息哪来的,linux中的dmesg命令简介
今天, 我们来介绍一个linux中的dmesg命令,事实上, 我们之前用过, 但是没有单独介绍过. 看一下dmesg命令的用途吧: dmesg命令用会把开机信息存到ring bufer中, 形成一个缓 ...
- linux中的strip命令简介------给文件脱衣服
作为一名linux开发人员, 如果没有听说过strip命令, 那是很不应该的. strip这个单词, 大家应该早就学过了, 你就记住是脱衣服就行了, 别的不要多想. 在linux中, ...
- linux中的lsof命令简介
我们都知道, 在linux中, 任何东西都是以文件形式存在的, 这句话貌似被大家说的太多次了, 下面仅仅举3个例子. 比如, ls命令其实也是个文件, 它对应一个可执行文件, 当敲入ls的时候, 实际 ...
- linux中的nm命令简介【转】
(转自:https://blog.csdn.net/stpeace/article/details/47089585) nm不是ni ma的缩写, 当然, 也不是ni mei的缩写, 而是names的 ...
- linux中的nm命令
代码在git 是names的缩写, nm命令主要是用来列出某些文件中的符号(说白了就是一些函数和全局变量等). 下面, 我们一起来看看. linux中的nm命令简介 nm * nm: main.c: ...
- linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件
一.方案: Linux中使用sed命令或awk命令修改常规配置文件 二.步骤: 1.假设有一个a.txt,内容如下: #!/bin/bash aa= bbb= ccc= #ddd= 2.如果想要把里面 ...
- Python学习之旅:使用Python实现Linux中的ls命令
一.写在前面 前几天在微信上看到这样一篇文章,链接为:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在这篇文章中,有这样一段话,吸引了我的注意: ...
- python中的ls是什么意思_Python学习之旅:使用Python实现Linux中的ls命令
一.写在前面 在 Linux 中 ls 是一个使用频率非常高的命令了,可选的参数也有很多, 算是一条不得不掌握的命令.Python 作为一门简单易学的语言,被很多人认为是不需要认真学的,或者只是随便调 ...
- 【Linux/Unix】Linux中的seq命令
1 简介 Linux中的seq命令可以用来生成指定范围内.指定间隔的数字列表,常用在while.for和until等循环中. 2 语法及使用示例 2.1 语法 seq通常有三种语法形式: (1) se ...
最新文章
- 京瓷 打印 打印机 账户_UV打印机市场竞争的关键是什么?
- flink的datastream进行join操作没有输出结果一例
- 电信运营商占IDC市场65%:中国电信占行业半数以上
- winform控件的学习
- 架构的变迁,从分层架构先聊起
- 二维数组七行七列C语言,C语言中级教程 再谈数组-7.ppt
- element table多选和单选
- Android应用去广告方法盘点
- 宝健中国用产品缔造口碑,深受消费者信赖
- Kettle的“增加序列”(自增字段)的使用
- Android开发技巧——Camera拍照功能
- 直播已入下半场,秀场直播该何去何从?
- DocSearcher:文档搜索引擎
- 精辟!(/usr/bin/ld: cannot find -lxxx)可能出现的问题和原因
- 多边形网格到B-Rep实体转换:算法详细信息和C ++代码示例
- Python 八皇后问题(Eight queens)的简单解法
- 图解六种全面质量管理工具用法和举例
- Java命令行形式将程序打包成jar包
- 百度贴吧发贴机探索(一)
- 什么是终身学习(Life Long Learning / Continuous Learning / Never Ending Learning / Incremental Learning)