转载自:http://blog.csdn.net/stpeace/article/details/47069215

在linux中, 有些命令是大家通用的, 比如ls, rm, mv, cp等等, 这些我觉得没有必要再细说了。 而有些命令, 只有开发人员才会用到的, 这类命令, 作为程序员的我们, 是有必要了解的, 有的甚至需要熟练使用。

有的人总说, 这些命令不重要, 用的时候去查就行了, 这么多么扯淡的说法啊。 具体用法细节是可以可查, 但至少得知道有ldd这个东西吧。连ldd都不知道, 怎么知道ldd是干啥的呢?

在本文中, 我们来介绍一下ldd命令, 尽管它非常简单。  哦, 我突然想起来, 我有个朋友, 她的名字的是三个字, 首写字母刚好是l, d, d, 有点意思。  在linux中, ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。  当然, 你也可以用ldd --help或者man ldd来看其用法。 下面, 我们也来看看:

test.h的内容为:

  1. void print();

test.c的内容为:

  1. #include <stdio.h>
  2. #include "test.h"
  3. void print()
  4. {
  5. printf("rainy days\n");
  6. }

main.c的内容为:

  1. #include "test.h"
  2. int main()
  3. {
  4. print();
  5. return 0;
  6. }

进行一系列的编译, 并用ldd命令, 得到:

  1. [taoge@localhost learn_ldd]$ ls
  2. main.c  test.c  test.h
  3. [taoge@localhost learn_ldd]$ gcc -c main.c test.c
  4. [taoge@localhost learn_ldd]$ gcc main.o test.o
  5. [taoge@localhost learn_ldd]$ ls
  6. a.out  main.c  main.o  test.c  test.h  test.o
  7. [taoge@localhost learn_ldd]$ ./a.out
  8. rainy days
  9. [taoge@localhost learn_ldd]$
  10. [taoge@localhost learn_ldd]$
  11. [taoge@localhost learn_ldd]$
  12. [taoge@localhost learn_ldd]$ ldd *
  13. a.out:
  14. linux-gate.so.1 =>  (0x00ba1000)
  15. libc.so.6 => /lib/libc.so.6 (0x0087e000)
  16. /lib/ld-linux.so.2 (0x00858000)
  17. main.c:
  18. ldd: warning: you do not have execution permission for `./main.c'
  19. not a dynamic executable
  20. main.o:
  21. ldd: warning: you do not have execution permission for `./main.o'
  22. not a dynamic executable
  23. test.c:
  24. ldd: warning: you do not have execution permission for `./test.c'
  25. not a dynamic executable
  26. test.h:
  27. ldd: warning: you do not have execution permission for `./test.h'
  28. lddlibc4: cannot read header from `./test.h'
  29. test.o:
  30. ldd: warning: you do not have execution permission for `./test.o'
  31. not a dynamic executable
  32. [taoge@localhost learn_ldd]$

可以看到a.out依赖于libc.so.6这个库, 而这个库的路径为/lib/libc.so.6

我们继续看使用静态链接库的情形:

  1. [taoge@localhost learn_ldd]$ ls
  2. main.c  test.c  test.h
  3. [taoge@localhost learn_ldd]$ gcc -c test.c
  4. [taoge@localhost learn_ldd]$ ar rcs libtest.a test.o
  5. [taoge@localhost learn_ldd]$ gcc main.c -L. -ltest
  6. [taoge@localhost learn_ldd]$ ls
  7. a.out  libtest.a  main.c  test.c  test.h  test.o
  8. [taoge@localhost learn_ldd]$ ./a.out
  9. rainy days
  10. [taoge@localhost learn_ldd]$
  11. [taoge@localhost learn_ldd]$
  12. [taoge@localhost learn_ldd]$
  13. [taoge@localhost learn_ldd]$ ldd *
  14. a.out:
  15. linux-gate.so.1 =>  (0x00e7c000)
  16. libc.so.6 => /lib/libc.so.6 (0x0087e000)
  17. /lib/ld-linux.so.2 (0x00858000)
  18. libtest.a:
  19. ldd: warning: you do not have execution permission for `./libtest.a'
  20. not a dynamic executable
  21. main.c:
  22. ldd: warning: you do not have execution permission for `./main.c'
  23. not a dynamic executable
  24. test.c:
  25. ldd: warning: you do not have execution permission for `./test.c'
  26. not a dynamic executable
  27. test.h:
  28. ldd: warning: you do not have execution permission for `./test.h'
  29. lddlibc4: cannot read header from `./test.h'
  30. test.o:
  31. ldd: warning: you do not have execution permission for `./test.o'
  32. not a dynamic executable
  33. [taoge@localhost learn_ldd]$

这次用静态库, 结果还是差不多, 就没什么好说的了。

我们继续看使用动态链接库时的情形:

  1. [taoge@localhost learn_ldd]$ ls
  2. main.c  test.c  test.h
  3. [taoge@localhost learn_ldd]$ gcc -c test.c
  4. [taoge@localhost learn_ldd]$ gcc -shared -fPIC -o libtest.so test.o
  5. [taoge@localhost learn_ldd]$ gcc main.c -L. -ltest
  6. [taoge@localhost learn_ldd]$ ls
  7. a.out  libtest.so  main.c  test.c  test.h  test.o
  8. [taoge@localhost learn_ldd]$ ./a.out
  9. ./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
  10. [taoge@localhost learn_ldd]$
  11. [taoge@localhost learn_ldd]$
  12. [taoge@localhost learn_ldd]$
  13. [taoge@localhost learn_ldd]$ ldd *
  14. a.out:
  15. linux-gate.so.1 =>  (0x00f3d000)
  16. libtest.so => not found
  17. libc.so.6 => /lib/libc.so.6 (0x0087e000)
  18. /lib/ld-linux.so.2 (0x00858000)
  19. libtest.so:
  20. linux-gate.so.1 =>  (0x0031d000)
  21. libc.so.6 => /lib/libc.so.6 (0x00110000)
  22. /lib/ld-linux.so.2 (0x00858000)
  23. main.c:
  24. ldd: warning: you do not have execution permission for `./main.c'
  25. not a dynamic executable
  26. test.c:
  27. ldd: warning: you do not have execution permission for `./test.c'
  28. not a dynamic executable
  29. test.h:
  30. ldd: warning: you do not have execution permission for `./test.h'
  31. lddlibc4: cannot read header from `./test.h'
  32. test.o:
  33. ldd: warning: you do not have execution permission for `./test.o'
  34. not a dynamic executable
  35. [taoge@localhost learn_ldd]$
  36. [taoge@localhost learn_ldd]$ su root
  37. Password:
  38. [root@localhost learn_ldd]# cp libtest.so /usr/lib/
  39. [root@localhost learn_ldd]# ./a.out
  40. rainy days
  41. [root@localhost learn_ldd]# exit
  42. exit
  43. [taoge@localhost learn_ldd]$ ./a.out
  44. rainy days
  45. [taoge@localhost learn_ldd]$
  46. [taoge@localhost learn_ldd]$
  47. [taoge@localhost learn_ldd]$
  48. [taoge@localhost learn_ldd]$ ldd a.out
  49. linux-gate.so.1 =>  (0x00510000)
  50. libtest.so => /usr/libtest.so (0x00fe3000)
  51. libc.so.6 => /lib/libc.so.6 (0x0087e000)
  52. /lib/ld-linux.so.2 (0x00858000)
  53. [taoge@localhost learn_ldd]$

首先, 我们可以看到, a.out依赖于libtest.so这个库, 但是, 结果是not found, 找不到。 为什么呢? 因为在/usr/lib下面没有libtest.so, 后来, 我把libtest.so拷贝过去(需要root权限), 就OK了。 另外, 我们也应该看到, libtest.so的依赖库也是可以通过ldd命令找到的。

当然, 如果不想自己写程序, 但想试一下ldd命令, 那也可以, 直接如下:

  1. [taoge@localhost learn_ldd]$ ldd /bin/ls
  2. linux-gate.so.1 =>  (0x0052b000)
  3. libselinux.so.1 => /lib/libselinux.so.1 (0x00b52000)
  4. librt.so.1 => /lib/librt.so.1 (0x00a5c000)
  5. libcap.so.2 => /lib/libcap.so.2 (0x0489c000)
  6. libacl.so.1 => /lib/libacl.so.1 (0x048c9000)
  7. libc.so.6 => /lib/libc.so.6 (0x0087e000)
  8. libdl.so.2 => /lib/libdl.so.2 (0x00a0c000)
  9. /lib/ld-linux.so.2 (0x00858000)
  10. libpthread.so.0 => /lib/libpthread.so.0 (0x00a13000)
  11. libattr.so.1 => /lib/libattr.so.1 (0x04d99000)
  12. [taoge@localhost learn_ldd]$ ldd /bin/mv
  13. linux-gate.so.1 =>  (0x00944000)
  14. libselinux.so.1 => /lib/libselinux.so.1 (0x00b52000)
  15. librt.so.1 => /lib/librt.so.1 (0x00a5c000)
  16. libacl.so.1 => /lib/libacl.so.1 (0x048c9000)
  17. libattr.so.1 => /lib/libattr.so.1 (0x04d99000)
  18. libc.so.6 => /lib/libc.so.6 (0x00110000)
  19. libdl.so.2 => /lib/libdl.so.2 (0x00a0c000)
  20. /lib/ld-linux.so.2 (0x00858000)
  21. libpthread.so.0 => /lib/libpthread.so.0 (0x00a13000)
  22. [taoge@localhost learn_ldd]$

在实际linux开发与调试中, 要经常查看动态库依赖关系, ldd用得还是比较多的, 特别是出现故障的时候。OK, ldd命令就简单介绍到这里了, 虽然简单, 但很实用, 故不可不知。

linux中的ldd命令简介的更多相关文章

  1. linux中的strings命令简介2

    摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 之前我们聊过linux strings的用法和用 ...

  2. linux中的strings命令简介

    摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 在linux下搞软件开发的朋友, 几乎没有不知道 ...

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

    1.去掉-g,等于程序做了--strip-debug2.strip程序,等于程序做了--strip-debug和--strip-symbol 作为一名Linux开发人员, 如果没有听说过strip命令 ...

  4. linux中的strip命令简介------给文件脱衣服【转】

    转自:http://blog.csdn.net/stpeace/article/details/47090255 版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则 ...

  5. linux中的nm命令简介

    转:http://blog.csdn.net/stpeace/article/details/47089585 一般来说, 搞linux开发的人, 才会用到nm命令, 非开发的人, 应该用不到. 虽然 ...

  6. linux中的strip命令简介

    转载:https://blog.csdn.net/qq_37858386/article/details/78559490 strip:去除,剥去     一.下面是man strip获得到的信息,简 ...

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

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

  8. Linux中的历史命令

    Linux中的历史命令一般保存在用户    /root/.bash_history history 选项 历史命令保存文件夹 选项     -c:清空历史命令     -w :把缓存中的历史命令写入历 ...

  9. 关于XShell的常见使用和设置以及Linux中的常见命令.

    本文部分转自:http://sundful.iteye.com/blog/704079 和 http://www.vckai.com/p/5 有时候在XShell中操作的一些命令傻傻的分不清这个命令到 ...

随机推荐

  1. OpenStack项目及组件功能简单介绍

    核心项目3个 1.控制台 服务名:Dashboard 项目名:Horizon 功能:web方式管理云平台,建云主机,分配网络,配安全组,加云盘 2.计算 服务名:计算 项目名:Nova 功能:负责响应 ...

  2. selenium webdriver学习(九)------------如何操作cookies(转)

    selenium webdriver学习(九)------------如何操作cookies 博客分类: Selenium-webdriver   Web 测试中我们经常会接触到Cookies,一个C ...

  3. VSCode配置启动Vue项目

    下载安装并配置VSCode 随便百度上搜个最新的VSCode安装好后,点击Ctrl + Shit + X打开插件扩展窗口进行插件扩展,这里要安装两个插件. 1.vetur插件的安装 该插件是vue文件 ...

  4. behavior planning——13. implement a cost function in C++

    In the previous quizzes, you designed a cost function to choose a lane when trying to reach a goal i ...

  5. supersocket新的配置属性 "textEncoding"

    在 SuperSocket 1.6 之前的版本, 当你通过Session对象发送文本时, 将文本信息转换成能够通过Socket传输的二进制数据的默认编码是UTF8. 你可以通过设置 Session 的 ...

  6. activiti 如何使用database前缀来区分activiti数据库和业务数据库

    为什么80%的码农都做不了架构师?>>> 第一步是先集成好activiti,我使用的是5.22.0,使用springboot集成,pom文件如下: ​ <parent> ...

  7. css3鼠标移动图片上移效果

    css3的功能真是很强大,学无止境,不多说,直接上代码 css部分: <style> ;;} .text-center{text-align:center} .col_cont{width ...

  8. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  9. Python--day65--模板语言之变量相关语法

    Django的模板语言: 1.目前已经学过的模板语言: 2,模板语言总结: 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Djan ...

  10. 【js】vue 2.5.1 源码学习 (七) 初始化之 initState 响应式系统基本思路

    大体思路(六) 本节内容: 一.生命周期的钩子函数的实现 ==> callHook(vm , 'beforeCreate') beforeCreate 实例创建之后 事件数据还未创建 二.初始化 ...