ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Linux小命令】一文讲清ldd命令及使用场景 [打印本页]

作者: 王柳    时间: 2024-7-12 01:21
标题: 【Linux小命令】一文讲清ldd命令及使用场景
前言

博主本日ubuntu编译go项目出来的一个可实行文件,放centos运行发现居然依赖于XXlib库。然后我一下就想到两个系统库版本不同等,重编。换系统,导项目,配情况……
等等,编出来的文件为啥还需要lib库??
然后使用ldd命令检察,表现除了依赖的共享库文件。但是为啥会依赖呢?一会儿我们会主要介绍ldd命令的功能。

比较正常编译出来的go步伐的设置 go env 发现不同的只有CGO_ENABLED=0 CGO_ENABLED=1 两个参数区别,这里博主去检察了一下这个情况变量的用处。
CGO_ENABLED=0 是一个情况变量,用于控制 Go 语言步伐是否使用 CGO(C 与 Go 之间的接口)。当 CGO_ENABLED 设置为 0 时,Go 步伐将不会实验链接任何 C 代码或库。这通常用于确保 Go 步伐可以在没有 C 编译器的情况中编译和运行,比方在纯 Go 容器中。
末了使用CGO_ENABLED=0 go build重新编译即可。如下图所示即为不依赖于库的可实行文件。

下面进入正题:ldd命令

ldd命令是Linux系统中的一个工具,用于打印出一个可实行文件所依赖的共享库文件(动态链接库)
在Linux操作系统中,步伐运行时往往依赖于多个动态链接库(Dynamic Link Libraries,简称DLLs或.so文件)。这些库文件提供了步伐运行所需的函数和数据结构。为了相识一个步伐依赖哪些库文件以及库的版本,通常可以使用ldd命令来实现这一目的[2]。它不仅能够列出步伐运行时需要加载的共享库文件及其路径,还能帮助调试步伐、办理运行时错误以及优化系统情况[3]。
起首,ldd命令的根本语法如下:
  1. ldd [选项] 可执行文件或共享库文件
复制代码
此中,常用选项包括:

比方,检察某个可实行文件(如ls命令)所需的动态库,可以使用以下命令[1][4]:
  1. ldd $(which ls)
复制代码
此命令将输出类似以下的结果:
  1. linux-vdso.so.1 =>  (0x00007ffd3a7b3000)
  2. libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5d5e18b000)
  3. libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f5d5e161000)
  4. ...
复制代码
这表明ls命令依赖于libpthread.so.0、libselinux.so.1等共享库文件,每个依赖项的路径都会表现在箭头(=>)之后。
其次,ldd命令的工作原理是通过设置一系列的情况变量,如LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION和LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS情况变量不为空时,任何可实行步伐在运行时,它都会只表现模块的依赖关系,而步伐并不真正实行[1][3]。实际上,ldd命令的本质是通过实行/lib/ld-linux.so.*来实现的[1]。
在使用ldd命令时,还可以结合其他参数来获取更多信息。比方,使用-v参数可以打印所有相干信息,包括符号的版本信息;使用-u参数则可以打印未使用的直接依赖项[4]。这对于深入理解步伐的运行机制非常有帮助。
末了,值得注意的是,ldd命令只能用于分析动态链接的步伐和库文件,如果步伐或库文件是静态链接的,则无法列出其依赖的库文件[2]。此外,由于ldd需要读取可实行文件或共享库文件的符号表信息,因此可能需要足够的权限来实行该命令,遇到权限问题时可以实验使用sudo命令提升权限[2]。
综上所述,ldd命令是一个强盛的工具,能够帮助人们相识步伐依赖的动态链接库文件及其路径,从而更好地调试步伐、优化系统情况以及理解步伐运行机制。在使用ldd命令时需要注意权限问题、静态链接与动态链接的区别以及库文件路径的解析方式。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4