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 静态库文件名

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10944.shtml

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

相关文章

什么事防抖和节流,有什么区别,如何实现

防抖和节流,本质上是优化高频率执行代码的一种手段,比如:resize、scroll、keypress、mousemove这些事件在触发的时候,会不断调用绑定在事件上的回调函数,这样极大浪费资源,降低前端性能。 为了优化体验&am…

ipa 分区算法分析,图解

参考 Room Segmentation: Survey, Implementation, and Analysis. 分区算法调查,实现以及评估对比 相关论文 分区算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形态分割 Interactive SLAM using …

函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)

函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)在C和C等编程语言中扮演着不同的角色,但它们有时在概念上可能会有些重叠。下面是它们之间的主要…

NOR FLASH介绍

参考 http://t.csdnimg.cn/gHcrG 一、NOR FLASH简介 XIP技术:https://blog.csdn.net/ffdia/article/details/87437872?fromshareblogdetail NOR Flash 和 NAND Flash 的特点和应用举例: NOR Flash: 特点: 支持随机访问,可以直接…

QT作业4

1、思维导图 2、使用定时器完成闹钟 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> #include <QLabel> #include <QPushButton> #include <QTextEdit> #include <QDebug> #include <…

收集邮票C++题目【概率期望DP+数学推导】

题意 Description 有 n n n 种不同的邮票&#xff0c;皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买&#xff0c;每次只能买一张&#xff0c;并且 买到的邮票究竟是 n n n 种邮票中的哪一种是等概率的&#xff0c;概率均为 1 n \frac{1}{n} n1​。但是由…

【elasticsearch】慢查询替代查询审计的尝试

【elasticsearch】慢查询替代查询审计的尝试 使用了es有两年了&#xff0c;突然发现一个&#xff0c;es没有查询审计日志&#xff0c;某个用户查询了某个索引的审计。 找了官方文档和社区的回复都是说使用slow log替代慢查询。 尝试一下。 参考链接1&#xff1a;https://discus…

Py深度学习基础|关于Batch Normalization

1. 为什么需要Batch Normalization 通常我们会在输入层进行数据的标准化处理&#xff0c;这是为了让模型学习到更好的特征。同样&#xff0c;在模型的中间层我们也可以进行normalize。在神经网络中, 数据分布对训练会产生影响。 比如我们使用tanh作为激活函数&#xff0c;当输入…

Baidu Comate智能编码助手:AI编程时代提升效率的好帮手

目录 写在前面一、如何安装二、如何使用场景需求体验步骤 三、AI 编程实战指令功能插件功能知识库功能 四、问题建议五、体验总结&#x1f680;写在最后 写在前面 Baidu Comate 是基于文心大模型的 AI编程工具&#xff0c;它结合百度积累多年的编程现场大数据和外部优秀开源数据…

MySQL中的多表查询

数据库设计范式(范例) 好的数据库设计&#xff0c;事倍功半&#xff0c;不会有歧义 第一范式&#xff1a;列保证原子性&#xff08;列不可再分解&#xff09; 联系方式&#xff1a;电话&#xff0c;微信&#xff0c;QQ&#xff0c;邮箱 这些都不可分解 第二范式&#xff1a;要…

annaconda详细解读换源文件

annaconda换源详细解读文件 annaconda换源详细解读文件 annaconda换源详细解读文件 #踩坑/annaconda换源详细解读通道问题 如何准确使用国内源高效安装GPU版本的Pytorch - 知乎 文件中的custom通道&#xff0c;需要自己手动添加到默认通道里面&#xff0c;记得后面更上/包名…

在xAnyLabeling中加载自己训练的yolov8s-obb模型进行半自动化标注

任务思路&#xff1a; 先使用xAnyLabeling标注一部分样本&#xff0c;训练出v1版本的yolov8-obb模型&#xff0c;然后加载yolov8-obb模型到xAnyLabeling中对其余样本进行半自动化标注。节省工作量。 任务流程&#xff1a; 1.准备xAnyLabeling标注工具 下载代码&#xff0c;…

Redis系列-3 Redis缓存问题

1.缓存的作用 数据库(如Mysql)的持久化特点带来了较低的性能&#xff0c;高并发的场景下&#xff0c;连接池很快被耗尽而出现宕机或DOS&#xff0c;无法继续对外提供服务。相对于数据库的硬盘IO&#xff0c;缓存中间件基于内存进行读写&#xff0c;从而具备较大的吞吐量和高并…

SpringBoot:注解详解

RequestMapping 注解在类上:表示该类中所有响应请求的方法都以此地址为父路径 value&#xff08;path&#xff09; 指定请求的实际访问地址&#xff0c;默认RequestMapping(“url”)的值url即为value的值。指定的地址可以是 URI Template 模式。 method 指定请求的method类型…

数据结构(四)——二叉树和堆(下)

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、二叉树链式结构的实现总结 前言 这篇博客我们将来了解普通二叉树的实现和应用&#xff0c;对大家之前分治和递归的理解有所挑战。 一、二叉树链式结构的实现 1.前置说明 在学习二叉…

Java入门——继承和多态(上)

包 包是组织类的一种方式. 使用包的主要目的是保证类的唯一性. 例如, 你在代码中写了一个 Test 类. 然后你的舍友也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致 代码不能编译通过. 导入包中的类 Java 中已经提供了很多现成的类供我们使用. 例如 public cla…

服装店会员管理系统结合小程序商城帮你挖掘出潜在客户

在现代社会&#xff0c;随着科技的不断进步和人们消费习惯的变化&#xff0c;传统的服装店已经不再能够满足消费者的需求。为了更好地服务客户&#xff0c;提升销售业绩&#xff0c;许多服装店开始引入会员管理系统&#xff0c;并结合小程序商城&#xff0c;实现线上线下的无缝…

LeetCode-2079. 给植物浇水【数组 模拟】

LeetCode-2079. 给植物浇水【数组 模拟】 题目描述&#xff1a;解题思路一&#xff1a;简单的模拟题&#xff0c;初始化为0&#xff0c;考虑先不浇灌每一个植物解题思路二&#xff1a;初始化为n&#xff0c;考虑每一个植物需要浇灌解题思路三&#xff1a;0 题目描述&#xff1a…

在ubuntu安装Docker容器

1、进入root用户模式 sudo -i 回车后&#xff0c;输入root的密码即可进入root模式2、在ubuntu上安装docker &#xff08;1&#xff09;直接使用 apt 安装&#xff0c;一般这样也自动启动好了 apt install docker.io3、验证安装成功&#xff0c;以及启动与校验 &#xff08;…

C++11:常用语法汇总

目录 &#x1f341;统一的列表初始化 { }initializer_list &#x1f341;decltype 推导表达式类型&#x1f341;可变参数模板解析可变参数包方法一方法二 &#x1f341;lambda 表达式捕捉列表的使用运用场景举例lambda表达式 与 函数对象 &#x1f341;统一的列表初始化 { } 在…