王柳 发表于 2024-7-12 01:21:28

【Linux小命令】一文讲清ldd命令及使用场景

前言

博主本日ubuntu编译go项目出来的一个可实行文件,放centos运行发现居然依赖于XXlib库。然后我一下就想到两个系统库版本不同等,重编。换系统,导项目,配情况……
等等,编出来的文件为啥还需要lib库??
然后使用ldd命令检察,表现除了依赖的共享库文件。但是为啥会依赖呢?一会儿我们会主要介绍ldd命令的功能。
https://i-blog.csdnimg.cn/direct/a3c1c3c867b541129bb8066d9abbc4fd.png
比较正常编译出来的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重新编译即可。如下图所示即为不依赖于库的可实行文件。
https://i-blog.csdnimg.cn/direct/ce97fe9bb5da45579c8b0f1724afddd9.png
下面进入正题:ldd命令

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


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Linux小命令】一文讲清ldd命令及使用场景