当前位置: 首页 > news >正文

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

一文讲清ldd命令及使用场景

    • 前言
    • 下面进入正题: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命令的基本语法如下:

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.0libselinux.so.1等共享库文件,每个依赖项的路径都会显示在箭头(=>)之后。

其次,ldd命令的工作原理是通过设置一系列的环境变量,如LD_TRACE_LOADED_OBJECTSLD_WARNLD_BIND_NOWLD_LIBRARY_VERSIONLD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的依赖关系,而程序并不真正执行[1][3]。实际上,ldd命令的本质是通过执行/lib/ld-linux.so.*来实现的[1]。

在使用ldd命令时,还可以结合其他参数来获取更多信息。例如,使用-v参数可以打印所有相关信息,包括符号的版本信息;使用-u参数则可以打印未使用的直接依赖项[4]。这对于深入理解程序的运行机制非常有帮助。

最后,值得注意的是,ldd命令只能用于分析动态链接的程序和库文件,如果程序或库文件是静态链接的,则无法列出其依赖的库文件[2]。此外,由于ldd需要读取可执行文件或共享库文件的符号表信息,因此可能需要足够的权限来执行该命令,遇到权限问题时可以尝试使用sudo命令提升权限[2]。

综上所述,ldd命令是一个强大的工具,能够帮助人们了解程序依赖的动态链接库文件及其路径,从而更好地调试程序、优化系统环境以及理解程序运行机制。在使用ldd命令时需要注意权限问题、静态链接与动态链接的区别以及库文件路径的解析方式。

http://www.lryc.cn/news/384935.html

相关文章:

  • 自费5K,测评安德迈、小米、希喂三款宠物空气净化器谁才是高性价比之王
  • 1373. 二叉搜索子树的最大键值和
  • 基于java + Springboot 的二手物品交易平台实现
  • Shopee本土店选品有什么技巧?EasyBoss ERP为你整理了6个高效选品的方法!
  • 3D在线展览馆的独特魅力,技术如何重塑展览业的未来?
  • 基于SpringBoot的藏区特产销售平台
  • hudi系列-schema evolution(一)
  • Redis-实战篇-缓存雪崩
  • 线性代数|机器学习-P18快速下降奇异值
  • 本地离线模型搭建指南-中文大语言模型底座选择依据
  • 【代码随想录】【算法训练营】【第51天】 [115]不同的子序列 [583]两个字符串的删除操作 [72]编辑距离
  • 24下半年软考集合!30s打破信息差!
  • 如何在Xcode中设置库路径
  • 小程序的基本使用
  • [保姆级教程]uniapp设置字体引入字体格式
  • 【Webpack】前端工程化之Webpack与模块化开发
  • 【Android】记录在自己的AMD处理器无法使用Android studio 虚拟机处理过程
  • LearnOpenGL - Android OpenGL ES 3.0 使用 FBO 进行离屏渲染
  • 人工智能虚拟仿真系统,解决算法难、编程难、应用场景难三大难题
  • CTE(公共表表达式)和视图在查询时的性能影响
  • 新能源行业必会基础知识-----电力市场概论笔记-----绪论
  • 003 SpringBoot操作ElasticSearch7.x
  • npm install报错Maximum call stack size exceeded
  • 第1章 基础知识
  • python脚本 限制 外部访问 linux服务器端口
  • Redis-哨兵模式-主机宕机-推选新主机的过程
  • 游戏工厂:AI(AIGC/ChatGPT)与流程式游戏开发
  • 每日一练 - OSPF 组播地址
  • AMHS工程师的培养
  • 如何在前端项目中制定代码注释规范