【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.mzph.cn/pingmian/36381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从新手到高手:彻底掌握MySQL表死锁

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 从新手到高手:彻底掌握MySQL表死锁 前言什么是死锁mysql死锁的原因1. 互斥资源的竞争…

maven仓库的作用以及安装 , DEA配置本地Maven

ay12-maven 主要内容 Maven的作用Maven仓库的作用Maven的坐标概念Maven的安装IDEA配置本地Maven 一、maven概述 1.1、项目开发中的问题 1、我的项目依赖一些jar包,我把他们放在哪里?直接拷贝到项目的lib文件夹中?如果我开发的第二个项目还是需要上面…

网管工作实践_02_IP/MAC地址管理工具

1、ipconfig命令格式及参数 ipconfig是内置于Windows的TCP/IP应用程序,用于显示本地计算机网络适配器的MAC地址和IP地址等配置信息,这些信息一般用来榆验手动配置的TCP/IP设置是否正确。当在网络中使用 DHCP服务时,IPConfig可以检测计算机中分…

6.26.8 基于多视角深度卷积神经网络的高分辨率乳腺癌筛查

1. 介绍 1.1 乳腺癌筛查 开发了一种新的DCN,它能够处理乳房x线摄影筛查的多个视图,并利用大分辨率图像而不缩小。将这种DCN称为多视图深度卷积网络(MV-DCN)。网络学习预测放射科医生的评估,将传入的样本分类为BI-RADS 0(“不完整”)&#xf…

网络问题排障专题-AF网络问题排障

目录 一、数据交换基本原理 1、ARP协议工作原理 数据包如图: 2、二层交换工作原理 简述核心概念: 二层交换原理-VLAN标签 3、三层交换工作原理 二、AF各种部署模式数据转发流程 1、路由模式数据转发流程 三、分层/分组逐一案例讲解 1、问题现…

免费分享一套SpringBoot+Vue在线水果(销售)商城管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue在线水果(销售)商城管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue在线水果(销售)商城管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue在线水果(销售)商…

Android高级面试_8_热修补插件化等

Android 高级面试:插件化和热修复相关 1、dex 和 class 文件结构 class 是 JVM 可以执行的文件类型,由 javac 编译生成;dex 是 DVM 执行的文件类型,由 dx 编译生成。 class 文件结构的特点: 是一种 8 位二进制字节…

探索Facebook的未来世界:数字社交的演进之路

在数字化和全球化的浪潮中,社交网络如Facebook已经成为了人们日常生活不可或缺的一部分。然而,随着技术的迅猛发展和用户需求的不断变化,Facebook正在经历着社交平台的演进之路。本文将探索Facebook的未来世界,分析数字社交的发展…

技术选型新趋势:中小型企业如何选用高效CRM“小型应用”进行客户管理

众所周知,CRM应用通过优化客户信息管理、提升销售效率、提高客户服务质量、实现市场营销自动化以及支持数据分析与决策等方面,为企业创造更大的价值,提升企业的竞争力和市场份额。 对初创型、中小型企业来说,使用合适的CRM应用至…

【LLVM】学习使用PGO优化

笔者在查看PGO优化时看到了本站的这篇文章,其中代码和命令行部分贴上了序号,且命令行带上了$符号,不便于读者调试。 遂将代码重新整理到gitee,链接在此。 汇编代码分析 目前笔者使用的llvm版本为llvm-19,主要改动发生…

RK3588编译环境配置

安装Ubuntu18.04 安装Ubuntu请参考其他教程 安装vmware-tools 如果vmware版本过低,vmware-tools安装可能会出现各种问题。 建议直接用apt-get install安装vmware-tools sudo apt-get update sudo apt-get install open-vm-tools open-vm-tools-desktop vmware-…

从CVPR 2024看域适应、域泛化最新研究进展

域适应和域泛化一直以来都是各大顶会的热门研究方向。 域适应指:当我们在源域上训练的模型需要在目标域应用时,如果两域数据分布差异太大,模型性能就有可能降低。这时可以利用目标域的无标签数据,通过设计特定方法减小域间差异&a…

Flutter笔记(一)- 安装和配置Flutter

一、下载Flutter 访问网址:https://docs.flutter.dev/get-started/install?hlzh-cn 根据电脑所使用的操作系统的平台进行选择。笔者电脑的操作系统为Windows,因此选择如图1-1的Windows图片: 图1-1 Flutter网站(一) …

国行版苹果Vision Pro即将发售 高昂定价吓退普通消费者?

2024年2月2日,苹果第一代空间计算设备Vision Pro在美国上市。6月28日,国行版苹果Vision Pro也将正式发售,别为256GB版29999元、512GB版31499元、1TB版32999元。不过从此前Vision Pro预售情况来看,Vision Pro的“杀手锏”在“价格”…

【应届应知应会】Linux常用指令

SueWakeup 个人主页:SueWakeup 系列专栏:学习技术栈 个性签名:保留赤子之心也许是种幸运吧 本文封面由 凯楠📸友情提供 目录 文件与目录管理 目录操作命令: ls [选项] [目录或文件] mkdir 文件操作命令&#xf…

多媒体本地化的五个步骤

多媒体本地化为试图在多个全球目的地建立市场的企业提供了许多好处。 由于多媒体并不局限于一个内容标签,因此您需要注意一些元素。 这个过程通常从翻译开始,但因为我们处理的是视频和音频,所以从一开始就要处理一个附加层。让我们从这里开…

SqlServer 2008远程过程调用失败,错误代码[0x800706be]

1、解决方式: 将SQL 2008 R2升级到SP1或SP2 下载地址:SQL Server 2008 R2 Service Pack 2下载地址

非最大值抑制(NMS)函数

非最大值抑制(NMS)函数 flyfish 非最大值抑制(Non-Maximum Suppression, NMS)是计算机视觉中常用的一种后处理技术,主要用于目标检测任务。其作用是从一组可能存在大量重叠的候选边界框中,筛选出最具代表…

初学51单片机之长短键应用定时炸弹及扩展应用

51单片机RAM区域划分 51单片机的RAM分为两个部分,一块是片内RAM,一块是片外RAM。 data: 片内RAM从 0x00 ~0x7F 寻址范围(0-127) 容量共128B idata: 片外RAM从 0x00~0xFF 寻址范围(0-255) 容量共256B pdata&am…

定位问题6.27 petal数据接口问题

petal接口响应结果 响应结果为空的数据,而我们需要的是正确的响应结果。 排查问题 确认接口是否正确 以下是爬虫的配置文件内容,我查看了PETAL_URL的接口,并询问接口开发人员,得知接口地址并未改变 确认接口请求体是否正确 我使…