linux下ldd命令的一些例子

ldd是Linux库操作中最实用的一个命令了,他可以查看一个程序所依赖的库。

如果你的程序执行起来缺少某个库,我们就去下载,但是把库放到哪里才能让程序正确是识别出来呢?使用ldd就可以了!

使用方法: ldd [options] file

功能:列出file运行所需的共享库
可用选项

➜  sbin  ldd --help
Usage: ldd [OPTION]... FILE...
      --help              print this help and exit
      --version           print version information and exit
  -d, --data-relocs       process data relocations  执行符号重部署,并报告缺少的目标对象
  -r, --function-relocs   process data and function relocations   对目标对象和函数执行重新部署,并报告缺少的目标对象和函数
  -u, --unused            print unused direct dependencies  打印不需要链接的库
  -v, --verbose           print all information   打印所有信息

例子

➜  /bin  ldd /bin/cp
    linux-vdso.so.1 =>  (0x00007fff8dbfe000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f94558e4000)
    librt.so.1 => /lib64/librt.so.1 (0x00007f94556dc000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00007f94554d3000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00007f94552ce000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f9454f3a000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f9454d35000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9455b0f000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9454b18000)

例子

ldd命令用来显示可执行程序的dependency,
sh-# ldd ./test_main
        libc.so.6 => /lib/libc.so.6 (0x40113000)
        /lib/ld-linux.so.3 (0x40022000)
sh-#

sh-# ldd -d ./test_main
        libc.so.6 => /lib/libc.so.6 (0x4011a000)
        /lib/ld-linux.so.3 (0x400f4000)
sh-#

sh-# ldd -r ./test_main
        libc.so.6 => /lib/libc.so.6 (0x401d4000)
        /lib/ld-linux.so.3 (0x400fb000)
sh-#

sh-# ldd -v ./test_main
        libc.so.6 => /lib/libc.so.6 (0x4009d000)
        /lib/ld-linux.so.3 (0x40077000)

        Version information:
        ./test_main:
                libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
        /lib/libc.so.6:
                ld-linux.so.3 (GLIBC_2.4) => /lib/ld-linux.so.3
                ld-linux.so.3 (GLIBC_PRIVATE) => /lib/ld-linux.so.3
sh-#

ldd命令本身不是一个可执行程序,它只是一个shell脚本,
sh-# which ldd
/usr/bin/ldd
sh-#
sh-# ldd /usr/bin/ldd
        not a dynamic executable
sh-#
sh-# ldd /bin/ln
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40061000)
        libc.so.6 => /lib/libc.so.6 (0x400cd000)
        /lib/ld-linux.so.3 (0x4003b000)
sh-#
sh-# ldd /bin/top
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x401b6000)
        libc.so.6 => /lib/libc.so.6 (0x401c9000)
        /lib/ld-linux.so.3 (0x40013000)
sh-#

sh-# ls -lh /lib/libc.so.6
lrwxrwxrwx 1 root root 14 Nov  6 08:28 /lib/libc.so.6 -> libc-2.12.2.so
sh-# ls -lh /lib/libc-2.12.2.so
-rwxr-xr-x 1 root root 1.2M Nov  6 08:28 /lib/libc-2.12.2.so
sh-#

sh-# ls -lh /lib/ld-linux.so.3
lrwxrwxrwx 1 root root 12 Nov  6 08:28 /lib/ld-linux.so.3 -> ld-2.12.2.so
sh-# ls -lh /lib/ld-2.12.2.so
-rwxr-xr-x 1 root root 120K Nov  6 08:28 /lib/ld-2.12.2.so
sh-#

sh-# ./test_main &
31631
sh-#
<xulin>test_main

sh-#
sh-# ps aux | grep test_main
root      1304  0.0  0.1  1728  544 ?        S+  12:13  0:00 grep test_main
root      2324  0.0  0.1  1460  324 ?        S+  11:22  0:00 ./test_main
root    31631  0.0  0.1  1460  324 ?        S+  12:10  0:00 ./test_main
sh-#

ldd命令的工作原理是通过设置一些环境变量来实现的,这些环境变量包括:
LD_TRACE_LOADED_ONJECTS、LD_WARN、LD_DEBUG、LD_VERBOSE、...
比如默认情况下执行ldd命令就会设置LD_TRACE_LOADED_ONJECTS,所以就能查看各个可执行程序的dependency。
sh-# ldd ./test_main
        libc.so.6 => /lib/libc.so.6 (0x400e7000)
        /lib/ld-linux.so.3 (0x40068000)
sh-#

可以手动设置这个环境变量,然后在执行test_main程序,
sh-# export LD_TRACE_LOADED_OBJECTS=1
sh-# ./test_main
        libc.so.6 => /lib/libc.so.6 (0x400ca000)
        /lib/ld-linux.so.3 (0x400a4000)
sh-#

使用unset命令将这个环境变量删除,即可恢复原状了,
sh-# unset  LD_TRACE_LOADED_OBJECTS
sh-# ./test_main &
26003
sh-#
<xulin>test_main

sh-#

ldd命令工作原理其实质上是通过ld-linux.so来实现的,
ld-linux.so会先于可执行程序工作并获得控制权。
实际上可以直接使用ld-linux.so来查看可执行程序的共享库依赖关系。
sh-# /lib/ld-linux.so.3 --list ./test_main
        libc.so.6 => /lib/libc.so.6 (0x40204000)
        /lib/ld-linux.so.3 (0x4005a000)
sh-#
sh-# ldd ./test_main
        libc.so.6 => /lib/libc.so.6 (0x40180000)
        /lib/ld-linux.so.3 (0x40077000)
sh-#

可以试验将libc.so.6删除掉,再来看是否可以执行test_main这个程序。
通过确认发现,/lib/所在的文件系统为只读文件系统,所以无法进行删除操作。

sh-# rm /lib/libc.so.6
rm: cannot remove `/lib/libc.so.6': Read-only file system
sh-#
sh-# mountpoint /lib/
/lib/ is not a mountpoint
sh-#
sh-# stat -f /lib/
  File: "/lib/"
    ID: fe0000000000 Namelen: 256    Type: ooxx
Block size: 131072
Blocks: Total: 59        Free: 0          Available: 0
Inodes: Total: 1028      Free: 0
sh-#

但是基于试验的目的,可以通过设置环境变量LD_LIBRARY_PATH来达到目的,
即将/lib/从LD_LIBRARY_PATH中删除掉,这样在运行test_main程序时就会无法
找到动态链接库,从而造成程序执行错误。
但是实际情况是:
1. sh-# echo $LD_LIBRARY_PATH中并没有/lib目录;
2. test_main测试程序仍然可以正确运行。
sh-# echo $LD_LIBRARY_PATH

sh-#
sh-# ./test_main &
6663

<xulin>test_main
sh-#

时间: 2024-08-02 13:27:52

linux下ldd命令的一些例子的相关文章

Linux下ps命令的10个基本例子

  在Linux下ps命令是用于查看系统上运行的进程的最基本的命令之一.它提供了当前进程的同时,如用户ID,CPU使用率,内存使用率,命令名称等,它不显示实时数据,如top或htop命令的详细信息.但是,即使是功能和输出简单,但它仍然是一个必用的过程管理/监控工具,每一个Linux新手应该知道这一点,好好学习.在这篇文章中,我们将使用ps命令以不同的方式来查看进程.筛选和排序它们,以加强基础部分. 语法注意: ps命令带有2种不一样的风格,分别是BSD和UNIX.新用户经常会混淆和错误地解释这两

Linux 下 Make 命令实例详解

  Linux 下 Make 命令实例详解          Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.本文我们将用一些实例来讨论 make 命令背后的工作机制. Make 如何工作的 对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标.这些目标通常存放在以 "Makefile" 来命名的特殊文件中,同时文件也包含与目标相对应的操作.更多信息,阅读关

理解Linux下Shell 命令的不同分类及它们的用法

当你打算真正操纵好你的 Linux 系统,没有什么能比命令行界面更让你做到这一点.为了成为一个 Linux 高手,你必须能够理解 Shell 命令的不同类型,并且会在终端下正确的使用它们. 在 Linux 下,命令有几种类型,对于一个 Linux 新手来说,知道不同命令的意思才能够高效和准确的使用它们.因此,在这篇文章里,我们将会遍及各种不同分类的 Linux Shell 命令. 需要注意一件非常重要的事:命令行界面和 Shell 是不同的,命令行界面只是为你提供一个访问 Shell 的方式.而

Linux 下 SSH 命令实例指南

Linux 下 SSH 命令实例指南 如果你已经在IT圈内混久了, 应该对 SSH 这个了不起的工具及其安全特性有所耳闻吧. 本教程可以让你在短时间内掌握通过 SSH 安全便利地连接到远程计算机的技术. 如果你对 SSH 还没什么概念, 可以先访问 维基百科 进行了解. 基本用法 最简单的 SSH 命令只需要指定用户名和主机名参数即可. 主机名可以是 IP 地址或者域名. 命令格式如下: $ ssh user@hostname 比如要在我的局域网内登录一个树莓派系统, 只需要简单的在命令行输入如

理解 Linux 下 Shell 命令的不同分类及它们的用法

当你打算真正操纵好你的 Linux 系统,没有什么能比命令行界面更让你做到这一点.为了成为一个 Linux 高手,你必须能够理解 Shell 命令的不同类型,并且会在终端下正确的使用它们. 在 Linux 下,命令有几种类型,对于一个 Linux 新手来说,知道不同命令的意思才能够高效和准确的使用它们.因此,在这篇文章里,我们将会遍及各种不同分类的 Linux Shell 命令. 需要注意一件非常重要的事:命令行界面和 Shell 是不同的,命令行界面只是为你提供一个访问 Shell 的方式.而

入门:15个关于Linux的‘cd’命令的练习例子

入门:15个关于Linux的'cd'命令的练习例子 在Linux中,'cd'(改变目录)命令,是对新手和系统管理员来说,最重要最常用的命令.对管理无图形界面的服务器的管理员,'cd'是进入目录,检查日志,执行程序/应用软件/脚本和其余每个任务的唯一方法.对新手来说,是他们必须自己动手学习的最初始命令 Linux中15个cd命令举例 所以,请用心学习,我们在这会带给你15个基础的'cd'命令,它们富有技巧和捷径,学会使用这些了解到的技巧,会大大减少你在终端上花费的努力和时间 课程细节 命令名称:c

[20121121]关于linux下history命令.txt

[20121121]关于linux下history命令.txt 昨天跟别人聊天,提到linux下history命令带来的安全隐患,主要是一些命令会记录在~/.bash_history中.实际上有许多方法可以使系统不记录这样一些命令,自己也看了一些文档,总结如下: 1.使用环境变量HISTCONTROL. export HISTCONTROL=ignorespace 如果设置HISTCONTROL=ignorespace,这样开头有空格的命令就不会记录.例子: export HISTCONTROL

grep-windows下类似linux下搜索命令

问题描述 windows下类似linux下搜索命令 想问一下如何在windows下有没有类似linux下的"find "+url+" | xargs grep "+keyWords的命令, 就是在指定路径下通过关键字搜索返回含有关键字的文件. 解决方案 写个批处理留着,类似http://wenku.baidu.com/link?url=KC_AB4vCJ85JbBT0EJFYwzQOvuqmDdATAOVwv85raC_q6N0-CXd9d7pk3n3yz1pobh

Linux下find命令实例

Linux下find命令实例 $find ~ -name "*.txt" -print #在$HOME中查.txt文件并显示 $find . -name "*.txt" -print $find . -name "[A-Z]*" -pri26nbsp; #对匹配的文件使用cpio命令,将他们备份到 磁带设备中-prune #忽略某个目录 $find . -name "[A-Z]*" -print #查以大写字母开头的文件 $f