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

linux程序分析命令(一)

linux程序分析命令(一)

  • **ldd:**用于打印共享库依赖。这个命令会显示出一个可执行文件所依赖的所有共享库(动态链接库),这对于解决运行时库依赖问题非常有用。
  • **nm:**用于列出对象文件的符号表。这个命令可以显示出定义和引用的符号,对于理解程序结构和调试非常有帮助。
  • objdump:显示二进制文件的信息。这个命令可以用来显示程序的汇编代码、段信息等,对于底层分析和调试很有用。
  • strace:跟踪系统调用。通过这个命令,你可以看到一个程序执行时所有的系统调用,这对于理解程序如何与操作系统交互非常重要。
  • ltrace:跟踪库函数调用。与strace类似,但是ltrace专注于跟踪程序调用库函数的情况。
  • gdb:GNU调试器。这是一个功能强大的调试工具,可以让你看到程序执行时的内部情况,比如变量的值、程序的执行流程等。
  • valgrind:内存调试工具。这个工具主要用于检测内存泄漏、内存损坏等问题,对于提高程序稳定性非常有帮助。
  • readelf:显示ELF格式文件的信息。这个命令可以显示出ELF格式的二进制文件(如Linux下的可执行文件和共享库)的详细信息,包括段、节、符号等。
  • file:确定文件类型。这个命令可以帮助你识别一个文件是二进制可执行文件、文本文件还是其他类型的文件。
  • size:显示二进制文件的段大小。这个命令会列出二进制文件各个段(如文本段、数据段)的大小,对于评估程序占用空间有一定帮助。

ldd命令

ldd命令是Linux下一个非常实用的工具,它用于显示一个可执行文件或共享库文件的依赖关系。基本上,它会列出程序运行所需要的所有共享库。

下面是ldd的基本用法和一些常见的使用场景。

基本用法

#命令格式:
ldd [选项] 文件...
#文件...:指定要检查的可执行文件或共享库文件。

最简单的用法是直接跟上你想要检查的文件名:

ldd /path/to/your/program
#这条命令会列出/path/to/your/program这个程序所依赖的所有共享库。

常见用法
检查可执行文件的依赖库:

ldd /usr/bin/ls
#这会显示ls命令所依赖的所有共享库。

检查动态库的依赖:

#如果你有一个共享库文件(例如,libexample.so),你可以使用ldd来查看它依赖哪些其他库:
ldd libexample.so

过滤输出:

#如果你只对特定的依赖感兴趣,可以使用管道和grep命令来过滤输出。例如,如果你只想看看是否依赖于libc.so.6:
ldd /path/to/your/program | grep libc.so.6

解决“不是动态可执行文件”错误:

如果你尝试对静态链接的可执行文件使用ldd,你可能会收到一个错误消息说“不是动态可执行文件”。这意味着该文件没有使用动态链接。在这种情况下,没有依赖关系可以显示。

使用ldd调试加载问题:

当你的程序因为缺少某个共享库而不能启动时,ldd可以帮助你快速识别缺少了哪个库。然后,你可以安装缺少的库或调整环境变量来解决问题。

高级用法

  1. 使用LD_TRACE_LOADED_OBJECTS环境变量
    ldd实际上是通过设置LD_TRACE_LOADED_OBJECTS=1环境变量来工作的。你可以直接使用这个环境变量来获取相同的输出,这在某些特殊情况下可能会有用:
LD_TRACE_LOADED_OBJECTS=1 /path/to/your/program
  1. 检查程序如何使用特定的共享库
    如果你想要检查一个程序是如何使用特定的共享库的,可以结合使用ldd和nm命令。首先使用ldd找出依赖,然后用nm检查符号信息:
ldd /path/to/your/program | grep libexample.so
nm -D /path/to/libexample.so
  1. 使用ldd进行安全检查
    虽然ldd主要用于依赖检查,但它也可以帮助识别潜在的安全风险。例如,通过检查程序依赖的库是否都来自可信路径,可以帮助识别可能的库劫持或路径注入问题。
ldd /path/to/your/program | grep -v "^/"
  1. 解决依赖问题
    当你遇到因缺少共享库而导致的程序启动问题时,ldd可以帮助你快速定位缺少哪个库。通过比较不同环境(例如,开发和生产)下的ldd输出,你可以找出缺失的依赖。

  2. 结合使用strace
    虽然不是ldd的直接用法,但结合使用strace可以帮助你深入了解程序在运行时的行为,包括它如何加载共享库。通过观察程序启动过程中的系统调用

    strace /path/to/your/program 2>&1 | grep openat  
    

nm 命令

nm命令在Linux中是一个非常有用的工具,它用于列出目标文件的符号表内容。符号表主要包含了程序中各种变量、函数的名称、类型、地址等信息。

下面是nm命令的一些基本用法:

查看目标文件的符号表:

nm 目标文件名

这将列出目标文件中所有符号的名称、类型和地址。

只显示未定义的符号:

nm -u 目标文件名

这个选项 (-u) 只会列出那些未定义的符号,这对于找出缺失的链接非常有用。

按大小排序显示符号:

nm --size-sort 目标文件名

使用 --size-sort 选项可以按照符号大小进行排序显示,这有助于分析哪些符号占用了较多空间。

只显示特定类型的符号:

nm --defined-only 目标文件名

通过 --defined-only 选项,可以只列出已定义的符号,忽略未定义的符号。

查看动态链接库中的符号:

 nm -D 动态链接库文件名

-D 或 --dynamic 选项用于查看动态链接库(.so 文件)中的符号。

过滤输出结果:

nm 目标文件名 | grep 符号名称

使用管道 (|) 和 grep 命令可以过滤输出结果,仅显示与特定符号名称相关的行。

查看C++程序的符号:

nm -C 目标文件名

-C 或 --demangle 选项用于显示C++程序中更易读的符号名称,因为C++编译器通常会改变函数名(名字修饰)以支持重载等特性。

解析C++的符号名:

C++程序中的符号名经过编译器处理后会变得难以阅读。使用c++filt工具可以将这些符号名解析成更易于理解的形式。

nm 目标文件名 | c++filt

这样可以使C++的复杂符号名变得可读。

使用正则表达式过滤符号:

nm命令支持使用正则表达式来过滤显示的符号,这在你想要查找符合特定模式的符号时非常有用。

nm 目标文件名 | grep '正则表达式'

例如,使用grep '^T’可以过滤出所有类型为T(即在文本段中的符号)的符号。

比较不同版本的二进制文件:
通过比较不同版本的二进制文件中的符号表,可以快速了解两个版本之间增加或删除了哪些功能。

nm -an 旧版本文件名 > old_symbols.txt
nm -an 新版本文件名 > new_symbols.txt
diff old_symbols.txt new_symbols.txt

这里,-a选项表示列出所有符号,包括调试符号;-n选项表示按照地址排序。

查看符号的大小:

#使用--print-size选项可以打印每个符号的大小,这对于分析程序占用空间非常有帮助。
nm --print-size 目标文件名

输出格式化的信息:

#nm命令允许通过--format或者-f选项指定输出格式,支持的格式包括bsd、sysv、posix等,这有助于根据需求调整输出信息的格式。
nm --format=sysv 目标文件名

查找静态库中未使用的函数:

#创建一个包含所有符号的列表,然后使用nm检查静态库(.a文件)中哪些函数未被使用。
nm --undefined-only 静态库文件名

这将列出所有未定义的符号,即可能未被使用的函数。

相关文章:

linux程序分析命令(一)

linux程序分析命令(一) **ldd:**用于打印共享库依赖。这个命令会显示出一个可执行文件所依赖的所有共享库(动态链接库),这对于解决运行时库依赖问题非常有用。**nm:**用于列出对象文件的符号表。这个命令可以显示出定…...

MYSQL数据库-SQL语句

数据库相关概念 名称全称简称数据库存储数据的仓库,数据是有组织的进行存储DataBase(DB)数据库管理系统操纵和管理数据库的大型软件DataBase Management System(DBMS)SQL操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准Structured Quer…...

MyBatis认识

一、定义 MyBatis是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java O…...

【WEEK11】 【DAY6】Employee Management System Part 7【English Version】

2024.5.11 Saturday Continued from 【WEEK11】 【DAY5】Employee Management System Part 6【English Version】 Contents 10.8. Delete and 404 Handling10.8.1. Modify list.html10.8.2. Modify EmployeeController.java10.8.3. Restart10.8.4. 404 Page Handling10.8.4.1. …...

【52】Camunda8-Zeebe核心引擎-Clustering与流程生命周期

Clustering集群 Zeebe本质是作为一个brokers集群运行,形成一个点对点网络。在这个网络中,所有brokers的功能与服务都相同,没有单点故障。 Gossip协议 Zeebe实现了gossip协议,并借此知悉哪些broker当前是集群的一部分。 集群使用…...

从零开始的软件测试学习之旅(八)jmeter线程组参数化及函数学习

jmeter线程组参数化及函数学习 Jmeter基础基本使用流程组件与元件 线程组线程的执行方式Jmeter组件执行顺序 常见属性设置查看结果数的作用域举例 Jmeter参数化实现方式1.用户定义参数2.用户参数3.函数4.csv数据文件设置 每日复习 Jmeter基础 基本使用流程 启动项目案例 启动…...

图文并茂:解析Spring Boot Controller返回图片的三种方式

欢迎来到我的博客,代码的世界里,每一行都是一个故事 图文并茂:解析Spring Boot Controller返回图片的三种方式 前言使用Base64编码返回图片使用byte数组返回图片使用Resource对象返回图片图片格式转换与性能对比 前言 在互联网的世界里&…...

问题处理记录 | 表输出报错 Packet for query is too large (5,214,153 > 4,194,304).

这个错误是由于MySQL服务器接收到的查询数据包太大而引起的。具体来说,错误消息中提到的数据包大小为5,214,153字节,而MySQL服务器默认只接受最大为4,194,304字节的数据包。 要解决这个问题,你可以尝试通过修改MySQL服务器的配置来增大max_a…...

数据结构_栈和队列(Stack Queue)

✨✨所属专栏:数据结构✨✨ ✨✨作者主页:嶔某✨✨ 栈: 代码:function/数据结构_栈/stack.c 钦某/c-language-learning - 码云 - 开源中国 (gitee.com)https://gitee.com/wang-qin928/c-language-learning/blob/master/function/…...

基于docker 的elasticsearch冷热分离及生命周期管理

文章目录 冷热集群架构的应用场景冷热集群架构的优势冷热集群架构实战搭建集群 索引生命周期管理认识索引生命周期索引生命周期管理的历史演变索引生命周期管理的基础知识Rollover:滚动索引 冷热集群架构的应用场景 某客户的线上业务场景如下:系统每天增…...

pikachu靶场(xss通关教程)

(注:若复制注入代码攻击无效,请手动输入注入语句,在英文输入法下) 反射型xss(get型) 1.打开网站 发现有个框,然后我们在框中输入一个“1”进行测试, 可以看到提交的数据在url处有显示&#xf…...

实验0.0 Visual Studio 2022安装指南

Visual Studio 2022 是一个功能强大的开发工具,对于计算机专业的学生来说,它不仅可以帮助你完成学业项目,还能为你将来的职业生涯打下坚实的基础。通过学习和使用 Visual Studio,你将能够更高效地开发软件,并在编程领域…...

数据结构之----线性表

线性表分为 顺序存储结构 和 链式存储结构 线性表的顺序存储结构: 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。 1,顺序表的结构: #define MAXSIZE 20 typedef int El…...

thinkphp5.1 模型auto

在ThinkPHP5.1中&#xff0c;模型的自动完成功能可以通过在模型类中定义auto属性来实现。这个属性是一个数组&#xff0c;包含了需要自动填充的字段和对应的处理规则。 以下是一个简单的例子&#xff0c;展示了如何在ThinkPHP5.1的模型中使用自动完成功能&#xff1a; <?…...

企业微信创建应用(一)

登录到企业微信后台管理(https://work.weixin.qq.com/)进入自建应用(应用管理-应用-创建应用) 3.查看参数AgentId和 Secret 4.企业微信查看效果...

Cosmo Bunny Girl

可爱的宇宙兔女郎的3D模型。用额外的骨骼装配到Humanoid上,Apple混合了形状。完全模块化,包括不带衣服的身体。 技术细节 内置,包括URP和HDRP PDF。还包括关于如何启用URP和HDRP的说明。 LOD 0:面:40076,tris 76694,verts 44783 装配了Humanoid。添加到Humanoid中的其他…...

初始化linux数据盘(3TB)分区-格式化-挂载目录

场景说明&#xff1a;某云给我们服务器加载了一块3TB的硬盘扩容&#xff08;没有直接扩&#xff0c;原因是原来的盘做的是mbr&#xff08;什么年代了&#xff0c;谁干的&#xff09;的分区&#xff0c;最大识别2TB&#xff09; 确认磁盘 输入命令lsblk 查看数据盘信息 &#…...

NFS网络文件系统的应用

1.配置2台服务器要求如下&#xff1a; a&#xff09;服务器1&#xff1a; 主机名&#xff1a;user-server.timinglee.org ip地址&#xff1a; 172.25.254.100 [rootserver100 桌面]# hostnamectl hostname user-server.timinglee.org [rootserver100 桌面]# ifconfig eth0: fl…...

AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

问题描述 修改图片大小的时候&#xff0c;代码报错&#xff1a;AttributeError: module PIL.Image has no attribute ANTIALIAS 解决方案 在pillow的10.0.0版本中&#xff0c;ANTIALIAS方法被删除了。 方法1&#xff1a;修改版本&#xff08;不推荐&#xff09; pip instal…...

进程的共享主存通信实验

进程的共享主存通信 【预备知识】 共享存储区为进程提供了直接通过主存进行通信的有效手段&#xff0c;不像消息缓冲机制那样需要系统提供缓冲&#xff0c;也不像pipe机制那样需要事先建立一个特殊文件&#xff0c;而是由通信双方直接访问某些共享虚拟储存空间。在Linux中&…...

深度缓冲技术在AI去衣中的神奇作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图形处理和视觉领域的应用日益增多。AI去衣技术便是其中一个颇具争议但又技术上引人入胜的话题。今天&#xff0c;我们将深入探讨一项关键技术——深度缓冲&#xff08;Depth Buffering&#xff09;&#xff0c;它…...

能效?性能?一个关于Windows下使用openssl speed进行速度测试的诡异问题

问题描述 最近的某个软件用到了openssl&#xff0c;所以就想着测试一下速度。我的电脑是惠普的&#xff0c;CPU是AMD Ryzen 7 PRO 6850HS&#xff0c;系统是Win11。我使用openssl自带的speed测试加密/解密的速度&#xff0c;命令大致如下&#xff1a; openssl speed -evp aes…...

block性能考虑和线程安全

性能考虑 频繁地创建和销毁大量的 block 可能会对性能造成影响&#xff0c;特别是当这些 block 被拷贝到堆上时。同时&#xff0c;block 捕获大量数据时也会增加内存使用。 在讨论性能考虑时&#xff0c;主要关注的是 block 的创建、拷贝到堆上以及捕获变量的成本。以下是针对…...

没有公网ip,如何实现外网访问内网?

目前拨号上网是最广泛的上网方式&#xff0c;这种方式优点是价格便宜&#xff0c;缺点是没有固定公网ip&#xff0c;每次重新您拨号ip地址都会变。如果有一台服务器&#xff0c;需要实现外网访问&#xff0c;在没有固定公网ip的环境下&#xff0c;该如何实现呢&#xff1f;使用…...

Python中如何将小数转化为百分数进行输出

小数转化为百分数 Python中如何将小数转化为百分数进行输出基本概念使用字符串格式化1. 使用字符串格式化操作符 %2. 使用str.format()方法3. 使用f-string&#xff08;格式化字符串字面量&#xff09; **重点内容**&#xff1a;**无论是通过使用%格式化操作符、str.format()方…...

加入全球少儿编程运动:Scratch让每个孩子都能成为创造者(Scratch最新版客户端和初/中/高级学习资料整理分享)

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f3e1; 演示环境 &#x1f3e1;&#x1f4d2; 文章内容 &#x1f4d2;&#x1f4dd; 安装与使用&#x1f4dd; 社区与资源 &#x1f388; 获取方式 &#x1f388;⚓️ 相关链接 ⚓️ &#x1f4d6; 介绍 &#x1f4d6; 你知道…...

引擎:主程渲染

一、引擎发展 二、引擎使用 1.游戏渲染流程 2.3D场景编辑器操作与快捷键 3.节点的脚本组件 脚本介绍 引擎执行流程 物体节点、声音组件\物理组件\UI组件、脚本组件 暴露变量到面板 4.节点的查找 基本查找 this.node&#xff1a;挂载当前脚本的节点A&#xff1b; this.nod…...

Java 高级面试问题及答案

问题6&#xff1a;请解释Java中的异常处理机制。 探讨过程&#xff1a; 异常处理是Java程序中错误处理的关键部分。正确地处理异常可以提高程序的稳定性和健壮性。 答案&#xff1a; Java中的异常处理机制允许程序在出现错误时&#xff0c;不会导致程序立即终止&#xff0c;而…...

邮件的安全认证(dkim/spf/dmarc)

dkim dkim是用来识别电子邮件合法以及完整性的一种技术手段&#xff0c;主要方式是通过非对称加密对邮件本身进行签名&#xff0c;邮件接收方可以使用发送方提供的公钥对签名进行校验&#xff0c;来确认邮件是否伪造或者被篡改。 如何查看dkim dkim签名被放在邮件原始内容的…...

单调栈问题

原理 单调栈的核心原理是&#xff1a;在栈内保持元素的单调性&#xff08;递增或递减&#xff09; 单调递增栈&#xff1a; 用于处理“下一个更小的元素”问题。当新元素比栈顶元素小或等于时&#xff0c;直接入栈&#xff1b;否则&#xff0c;一直从栈顶弹出元素&#xff0c…...