命令行使用方法

命令行使用方法,第1张

Linux中ldd命令的用法详解

ldd指令用于区分哪些动态函数库包含在可执行二进制档案中。在Linux中,ldd指令主要是查询程序需要的共享库,那么ldd指令实际应该如何使用呢?下面,我给大家详细介绍一下Linux下ldd指令的 *** 作方法。让我们学习和训练一些感兴趣的朋友。

LD指令用来区分一个可执行二进制文件有哪些动态函数库。

LinuxLdd的主要参数表明:

-version复制ldd的版本信息。

-v-Verbose复制所有信息内容,例如包含标记的版本信息。

-d-data-relocs实现标记重新分配,并报告总体目标的缺失(仅提供ELF格式)

-r-function-relocs重新配置总体目标和功能,并报告缺失的总体目标和功能(仅提供ELF格式)

-帮助使用信息内容

如果cmd中给定的库名包含'/',则此程序的libc5版本号将使用它作为库名;否则,它将在规范部分中搜索库。在当前目录下运行一个共享库,前缀为"。/"。

不正确:

Ld无法在a.out格式的共享库中工作。

Ldd不能在一些非常老的a.out程序上工作,这些程序是在C语言编译器ldd发布之前很久建立的。如果你一直对这类程序应用ldd,程序会尝试argc=0的运算方法,结果是无法预料的。

例如:

ldd/bin/bash

然而,ldd本身不是一个程序,而只是一个外壳脚本:

$哪个ldd

/usr/bin/ldd

$file/usr/bin/ldd

/usr/bin/ldd:Bourne-Againshell脚本文本可执行文件

ldd指令实际上是通过设置一些环境变量来完成的(换句话说,ldd的功效只是设置一些环境变量的值)

例如LD_TRACE_LOADED_OBJECTS

如果它的值不是空。

$exportLD_TRACE_LOADED_OBJECTS=1

美元/美元

linux-gate.so.1=》(0xb7fac000)

librt.so.1="/lib/TLS/i686/cmov/librt.so.1(0xb7f93000)

libselinux.so.1="/lib/libselinux.so.1(0xb7f79000)

libacl.so.1="/lib/libacl.so.1(0xb7f70000)

libc.so.6="/lib/TLS/i686/cmov/libc.so.6(0xb7e0d000)

libpthread.so.0="/lib/TLS/i686/cmov/libpthread.so.0(0xb7df4000)

/lib/ld-linux.so.2(0xb7fad000)

libdl.so.2="/lib/TLS/i686/cmov/libdl.so.2(0xb7df0000)

libattr.so.1="/lib/libattr.so.1(0xB7DEA000)

撤消此环境变量,ls可以恢复并再次应用:

$取消设置LD_TRACE_LOADED_OBJECTS

$ls/usr/

bin游戏包括liblib32lib64本地sbinsharesrcX11R6

大量的环境变量:

1、LD_TRACE_LOADED_对象

2、LD_WARN

3、LD_BIND_NOW

4、LD_库_版本

5、LD_VERBOSE

6、LD_DEBUG

LD默认设置打开的环境变量是:LD_TRACE_LOADED_OBJECTS=1。

其他独立变量(组合值)每个都匹配一些选项:

-d,-data-relocs-》LD_WARN=yes

-r,-function-relocs-"LD_warn和LD_BIND_NOW=yes

-u,-未使用-》LD_DEBUG="未使用"

-v,-verbose-》LD_VERBOSE=yes

LD_TRACE_LOADED_OBJECTS是必需的环境变量,其他视具体情况而定。

ldd指令的本质是:/lib/ld-linux.so.*

我们可以从上面的内容(在ls/usr中)了解到:/lib/ld-linux.so.2(0xb7fad000)。

$ls-l/lib/ld-linux.so.*

lrwxrwxrwx1rootroot92009-09-0522:54/lib/LD-Linux.so.2-》LD-2.9.so

刚编译完程序的文档可能是:/lib/ld.so,如果是libc5,就是/lib/ld-linux.so.1,而glibc2应该是/lib/ld-linux.so.2。

$/lib/LD-Linux.so.2-list/bin/ls

linux-gate.so.1=》(0xb8050000)

librt.so.1="/lib/TLS/i686/cmov/librt.so.1(0xb8037000)

libselinux.so.1="/lib/libselinux.so.1(0xb801d000)

libacl.so.1="/lib/libacl.so.1(0xb8014000)

libc.so.6="/lib/TLS/i686/cmov/libc.so.6(0xb7eb1000)

libpthread.so.0="/lib/TLS/i686/cmov/libpthread.so.0(0xb7e98000)

/lib/ld-linux.so.2(0xb8051000)

libdl.so.2="/lib/TLS/i686/cmov/libdl.so.2(0xb7e94000)

libattr.so.1="/lib/libattr.so.1(0xb7E8e000)

我们可以看到,以上等同于lddls。

ldd可以得到的共享库文件实际上是根据加载ldconfig的指令建立的文档(/etc/ld.so.cache)。

默认的共享库文件检索/lib优先于/usr/lib,并且只有一两个文件目录。如果要添加其他方式,必须根据ldconfig指令准备相关文档。

通常,ld-linux.so会按以下顺序搜索共享库:

1.DT_RPATH或DT_RUNPATH段

2.环境变量LD_LIBRARY_PATH

3./etc/ld.so.cache文档中的路径,但如果可执行程序在连接的情况下添加了-znodelib选项,则会被绕过。

4.默认设置是/lib和/usr/lib,但是如果添加了-znodeflib,就会被绕过。

以下由其他网友填写:

1.起初,ldd不是一个可执行程序,而只是一个shell脚本。

2.ldd可以显示信息,实现控制模块的依赖性。其基本原理是设置一系列环境变量,如LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不是空时,当所有可执行程序都在运行时,只会显示信息控制模块的依赖关系,而程序并没有实际执行。为什么不在shell终端设备上测试一下,如下:

(1)导出LD_TRACE_LOADED_OBJECTS=1

(2)执行所有程序,如ls等。,并查看程序的运行结果。

3.ldd可以根据控制模块的依赖关系原理来显示信息,其本质是基于LD-Linux.so(ELF动态库的loader)。我们知道,ld-linux.so控制模块会在可执行控制模块程序中工作并获得决策权,所以在设置这些环境变量时,ld-linux.so选择显示信息可执行控制模块的依赖关系。

4.其实ld-linux.so控制模块是可以马上实现的,比如:/lib/LD-Linux.so.2-list程序(相当于ldd程序)ldd指令 *** 作方法(摘自ldd-help)

名称ldd-复制共享库的相互依赖性

考试大纲LDD[可选项目]。。。文件。。。

描述cmd上ldd输出指定的每个程序或共享库所需的共享库。

选择权

-版本

复制ldd的版本信息

-v-详细

复制所有信息内容,如包含标记的版本信息。

-d-数据-重定位

实施标记重新分配,并报告缺失的总体目标(仅提供ELF格式)

-r函数-relocs

重新配置总体目标和功能,并报告缺失的总体目标和功能(仅提供ELF格式)

-帮助使用信息内容

ldd的规范版本号与glibc2一起呈现。Libc5是在老版本之前出现的,现在仍然存在于一些系统软件中。libc5版本号中的长期选项不兼容。另一方面,glibc2版本号与-V选项不兼容,只提供等效的-version选项。

如果cmd中给定的库名包含'/',则此程序的libc5版本号将使用它作为库名;否则,它将在规范部分中搜索库。在当前目录下运行一个共享库,前缀为"。/"。

Ld无法在a.out格式的共享库中工作。

Ldd不能在一些非常老的a.out程序上工作,这些程序是在C语言编译器ldd发布之前很久建立的。如果你一直对这类程序应用ldd,程序会尝试argc=0的运算方法,结果是无法预料的。

以上是我总结的Linux下应用ldd指令的 *** 作方法。ldd指令的专业知识是shell脚本制作,可以配合主参数的应用。ldd应用中的一些关键点需要注意。你掌握了吗?

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/770900.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-02
下一篇 2022-05-02

发表评论

登录后才能评论

评论列表(0条)

保存