在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命令简介相关推荐

  1. linux dmesg信息哪来的,linux中的dmesg命令简介

    今天, 我们来介绍一个linux中的dmesg命令,事实上, 我们之前用过, 但是没有单独介绍过. 看一下dmesg命令的用途吧: dmesg命令用会把开机信息存到ring bufer中, 形成一个缓 ...

  2. linux中的strip命令简介------给文件脱衣服

            作为一名linux开发人员, 如果没有听说过strip命令, 那是很不应该的. strip这个单词, 大家应该早就学过了, 你就记住是脱衣服就行了, 别的不要多想. 在linux中, ...

  3. linux中的lsof命令简介

    我们都知道, 在linux中, 任何东西都是以文件形式存在的, 这句话貌似被大家说的太多次了, 下面仅仅举3个例子. 比如, ls命令其实也是个文件, 它对应一个可执行文件, 当敲入ls的时候, 实际 ...

  4. linux中的nm命令简介【转】

    (转自:https://blog.csdn.net/stpeace/article/details/47089585) nm不是ni ma的缩写, 当然, 也不是ni mei的缩写, 而是names的 ...

  5. linux中的nm命令

    代码在git 是names的缩写, nm命令主要是用来列出某些文件中的符号(说白了就是一些函数和全局变量等). 下面, 我们一起来看看. linux中的nm命令简介 nm * nm: main.c: ...

  6. linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件

    一.方案: Linux中使用sed命令或awk命令修改常规配置文件 二.步骤: 1.假设有一个a.txt,内容如下: #!/bin/bash aa= bbb= ccc= #ddd= 2.如果想要把里面 ...

  7. Python学习之旅:使用Python实现Linux中的ls命令

    一.写在前面 前几天在微信上看到这样一篇文章,链接为:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在这篇文章中,有这样一段话,吸引了我的注意: ...

  8. python中的ls是什么意思_Python学习之旅:使用Python实现Linux中的ls命令

    一.写在前面 在 Linux 中 ls 是一个使用频率非常高的命令了,可选的参数也有很多, 算是一条不得不掌握的命令.Python 作为一门简单易学的语言,被很多人认为是不需要认真学的,或者只是随便调 ...

  9. 【Linux/Unix】Linux中的seq命令

    1 简介 Linux中的seq命令可以用来生成指定范围内.指定间隔的数字列表,常用在while.for和until等循环中. 2 语法及使用示例 2.1 语法 seq通常有三种语法形式: (1) se ...

最新文章

  1. 京瓷 打印 打印机 账户_UV打印机市场竞争的关键是什么?
  2. flink的datastream进行join操作没有输出结果一例
  3. 电信运营商占IDC市场65%:中国电信占行业半数以上
  4. winform控件的学习
  5. 架构的变迁,从分层架构先聊起
  6. 二维数组七行七列C语言,C语言中级教程 再谈数组-7.ppt
  7. element table多选和单选
  8. Android应用去广告方法盘点
  9. 宝健中国用产品缔造口碑,深受消费者信赖
  10. Kettle的“增加序列”(自增字段)的使用
  11. Android开发技巧——Camera拍照功能
  12. 直播已入下半场,秀场直播该何去何从?
  13. DocSearcher:文档搜索引擎
  14. 精辟!(/usr/bin/ld: cannot find -lxxx)可能出现的问题和原因
  15. 多边形网格到B-Rep实体转换:算法详细信息和C ++代码示例
  16. Python 八皇后问题(Eight queens)的简单解法
  17. 图解六种全面质量管理工具用法和举例
  18. Java命令行形式将程序打包成jar包
  19. 百度贴吧发贴机探索(一)
  20. 什么是终身学习(Life Long Learning / Continuous Learning / Never Ending Learning / Incremental Learning)

热门文章

  1. Python学习笔记 - 变量类型(1)
  2. rockchip 修改开机LOGO和注意事项
  3. ChatGPT论文写作指导01——教育技术学的研究对象如何增强在线教学交互?
  4. kafka部分属性配置字段详解
  5. Optional判断
  6. ADOConnection-CommandTimeOut
  7. 重新编译覆盖安装ubuntu16.04自带的python3.6.2
  8. 在Linux/centos下查看网卡型号,如何查看主板型号,CPU/显卡信息,硬盘型号等硬件信息
  9. 【硬件相关】网卡bond配置
  10. 计算机主机名 在哪里看,在win10中如何查看主机名