怎么区分网站是模板做的,网上推广购物平台怎么推广好,手机版网站模板,微信公众号官网登录一文讲清ldd命令及使用场景 前言下面进入正题#xff1a;ldd命令 前言
博主今天ubuntu编译go项目出来的一个可执行文件#xff0c;放centos运行发现居然依赖于XXlib库。然后我一下就想到两个系统库版本不一致#xff0c;重编。换系统#xff0c;导项目#xff0c;配环境…… 一文讲清ldd命令及使用场景 前言下面进入正题ldd命令 前言
博主今天ubuntu编译go项目出来的一个可执行文件放centos运行发现居然依赖于XXlib库。然后我一下就想到两个系统库版本不一致重编。换系统导项目配环境……
等等编出来的文件为啥还需要lib库
然后使用ldd命令查看显示除了依赖的共享库文件。但是为啥会依赖呢一会儿我们会主要介绍ldd命令的功能。
比较正常编译出来的go程序的设置 go env 发现不同的只有CGO_ENABLED0 CGO_ENABLED1 两个参数区别这里博主去查看了一下这个环境变量的用处。
CGO_ENABLED0 是一个环境变量用于控制 Go 语言程序是否使用 CGOC 与 Go 之间的接口。当 CGO_ENABLED 设置为 0 时Go 程序将不会尝试链接任何 C 代码或库。这通常用于确保 Go 程序可以在没有 C 编译器的环境中编译和运行例如在纯 Go 容器中。
最后使用CGO_ENABLED0 go build重新编译即可。如下图所示即为不依赖于库的可执行文件。 下面进入正题ldd命令
ldd命令是Linux系统中的一个工具用于打印出一个可执行文件所依赖的共享库文件动态链接库。
在Linux操作系统中程序运行时往往依赖于多个动态链接库Dynamic Link Libraries简称DLLs或.so文件。这些库文件提供了程序运行所需的函数和数据结构。为了了解一个程序依赖哪些库文件以及库的版本通常可以使用ldd命令来实现这一目的[2]。它不仅能够列出程序运行时需要加载的共享库文件及其路径还能帮助调试程序、解决运行时错误以及优化系统环境[3]。
首先ldd命令的基本语法如下
ldd [选项] 可执行文件或共享库文件其中常用选项包括
-v 或 --verbose显示详细信息模式打印所有相关信息[4]。-u 或 --unused显示未使用的直接依赖项[1]。-d 或 --data-relocs显示包含数据重定位的共享库[3]。-r 或 --function-relocs显示包含函数重定位的共享库[3]。
例如查看某个可执行文件如ls命令所需的动态库可以使用以下命令[1][4]
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环境变量不为空时任何可执行程序在运行时它都会只显示模块的依赖关系而程序并不真正执行[1][3]。实际上ldd命令的本质是通过执行/lib/ld-linux.so.*来实现的[1]。
在使用ldd命令时还可以结合其他参数来获取更多信息。例如使用-v参数可以打印所有相关信息包括符号的版本信息使用-u参数则可以打印未使用的直接依赖项[4]。这对于深入理解程序的运行机制非常有帮助。
最后值得注意的是ldd命令只能用于分析动态链接的程序和库文件如果程序或库文件是静态链接的则无法列出其依赖的库文件[2]。此外由于ldd需要读取可执行文件或共享库文件的符号表信息因此可能需要足够的权限来执行该命令遇到权限问题时可以尝试使用sudo命令提升权限[2]。
综上所述ldd命令是一个强大的工具能够帮助人们了解程序依赖的动态链接库文件及其路径从而更好地调试程序、优化系统环境以及理解程序运行机制。在使用ldd命令时需要注意权限问题、静态链接与动态链接的区别以及库文件路径的解析方式。