objdump命令解析

2024-05-03 11:28
文章标签 命令 解析 objdump

本文主要是介绍objdump命令解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、名称
    objdump-显示目标文件的工具
    
二、简介

       objdump [-a|--archive-headers]
               [-b bfdname|--target=bfdname]
               [-C|--demangle[=style] ]
               [-d|--disassemble[=symbol]]
               [-D|--disassemble-all]
               [-z|--disassemble-zeroes]               
               [-f|--file-headers]
               [-F|--file-offsets]               
               [-g|--debugging]
               [-e|--debugging-tags]
               [-h|--section-headers|--headers]
               [-i|--info]
               [-j section|--section=section]
               [-l|--line-numbers]
               [-S|--source]               
               [-r|--reloc]
               [-R|--dynamic-reloc]
               [-s|--full-contents]               
               [-t|--syms]
               [-T|--dynamic-syms]
               [-x|--all-headers]
               [-w|--wide]               
               [-V|--version]
               [-H|--help]
               objfile...
三、说明
  objdump可以显示一个或多个目标文件的信息。选项决定显示的具体信息。这些信息对于编译工具程序员以及希望程序编译和执行的程序员都特别有用。
  objfile...是需要显示的目标文件。当你指定存档文件时,objdump显示每个成员对象文件的信息。

四、选项
    这里显示的选项的长格式和短格式都是可以的,他们是等效的。以下选项中至少一项需要给出:-a,-d,-D,-e,-f,-g,-G,-h,-H,-p,-P,-r,-R,-s,-S,-t,-T,-V,-x。

    -a
    --archive-header
    如果objfile里任一个文件是归档文件,命令将显示归档文件的头信息(和ls -l方式一样)。除了ar tv列出的信息,objdump -a还显示归档文件中所有目标文件的格式。

    示例:
    add.h

    int Add(int a, int b);

    add.cpp

    #include "add.h"
    int Add(int a, int b){
        return a+b;
    }

    sub.h

    int Sub(int a, int b);

    sub.cpp

    #include "sub.h"
    int Sub(int a, int b){
        return a-b;
    }

    生成add.o
    g++ -c add.cpp -o add.o
    生成sub.o
    g++ -c sub.cpp -o sub.o

    合成静态库
    ar rcs libalg.a ./*.o

    输出结果:
    显示add.o
    $ objdump -a add.o
      add.o:     file format elf64-x86-64
      add.o

    显示libalg.a
    $ objdump -a libalg.a
    In archive libalg.a:

    add.o:     file format elf64-x86-64
    rw-r--r-- 0/0   1240 Jan  1 08:00 1970 add.o

    sub.o:     file format elf64-x86-64
    rw-r--r-- 0/0   1240 Jan  1 08:00 1970 sub.o

    对比ls -l结果:
    ls -l ./
    total 28
    -rw-rw-r-- 1 u3s u3s   57  4月 14 11:22 add.cpp
    -rw-rw-r-- 1 u3s u3s   25  4月 14 11:02 add.h
    -rw-rw-r-- 1 u3s u3s 1240  4月 14 11:31 add.o
    -rw-rw-r-- 1 u3s u3s 2698  4月 14 11:32 libalg.a
    -rw-rw-r-- 1 u3s u3s   57  4月 14 11:25 sub.cpp
    -rw-rw-r-- 1 u3s u3s   25  4月 14 11:17 sub.h
    -rw-rw-r-- 1 u3s u3s 1240  4月 14 11:31 sub.o

    objdump -a 比ls -l 多了file format信息,也就是文件是32位还是64位,上面显示64位。

    -C
    --demangle[=style]
    去掉名字修饰,显示为用户可读信息

    以上面生成的add.o为例
    $ objdump -t add.o

    add.o:     file format elf64-x86-64

    SYMBOL TABLE:
    0000000000000000 l    df *ABS*    0000000000000000 add.cpp
    0000000000000000 l    d  .text    0000000000000000 .text
    0000000000000000 g     F .text    0000000000000018 _Z3Addii

    _Z3Addii是函数Add修饰后的名称。

    加上-C选项后
    $ objdump -Ct add.o

    add.o:     file format elf64-x86-64

    SYMBOL TABLE:
    0000000000000000 l    df *ABS*    0000000000000000 add.cpp
    0000000000000000 l    d  .text    0000000000000000 .text
    0000000000000000 g     F .text    0000000000000018 Add(int, int)

    函数Add名称显示为可读的

    -d
    --disassemble
    --disassemble=symbol    
    反汇编,只显示包含指令的部分

    $ objdump -d add.o

    add.o:     file format elf64-x86-64


    Disassembly of section .text:

    0000000000000000 <_Z3Addii>:
       0:    f3 0f 1e fa              endbr64 
       4:    55                       push   %rbp
       5:    48 89 e5                 mov    %rsp,%rbp
       8:    89 7d fc                 mov    %edi,-0x4(%rbp)
       b:    89 75 f8                 mov    %esi,-0x8(%rbp)
       e:    8b 55 fc                 mov    -0x4(%rbp),%edx
      11:    8b 45 f8                 mov    -0x8(%rbp),%eax
      14:    01 d0                    add    %edx,%eax
      16:    5d                       pop    %rbp
      17:    c3                       ret 

    上面的内容就是函数Add的汇编代码

  -D
  --disassemble-all
  和-d选项类似,不仅包括指令部分,还包括所有非bss部分。-j可以指定段。

  --no-addresses
  反汇编时,不打印每行的地址以及符号、重定位的偏移。

  -f
  --file-headers
  显示每个 objfile 文件的整体头部摘要信息

  示例:
  $objdump -f a.out 
  输出:
  a.out:     file format elf64-x86-64
  architecture: i386:x86-64, flags 0x00000150:
  HAS_SYMS, DYNAMIC, D_PAGED
  start address 0x0000000000001040
 
  -h
  --section-headers
  --headers
  显示目标文件节头部摘要信息

  -H
  --help
  显示帮助信息

  -j name
  --section=name
  显示节name的信息,该选项可以出现多次

  -l
  --line-numbers
  显示代码行号,只能和-d, -D, 或者 -r 一起使用

  -S
  --source
  汇编和源代码交叉显示

  示例:
  $ objdump -S a.out
  输出:
  0000000000001141 <main>:

  int main(){
      1141: f3 0f 1e fa           endbr64 
      1145: 55                    push   %rbp
      1146: 48 89 e5              mov    %rsp,%rbp
      1149: 48 83 ec 10           sub    $0x10,%rsp
  int a = 10, b = 11;
      114d: c7 45 f4 0a 00 00 00  movl   $0xa,-0xc(%rbp)
      1154: c7 45 f8 0b 00 00 00  movl   $0xb,-0x8(%rbp)
  int sum = Add(a, b);
      115b: 8b 55 f8              mov    -0x8(%rbp),%edx
      115e: 8b 45 f4              mov    -0xc(%rbp),%eax
      1161: 89 d6                 mov    %edx,%esi
      1163: 89 c7                 mov    %eax,%edi
      1165: e8 bf ff ff ff        call   1129 <_Z3Addii>
      116a: 89 45 fc              mov    %eax,-0x4(%rbp)

  return 0;
      116d: b8 00 00 00 00        mov    $0x0,%eax
  }
      1172: c9                    leave  
      1173: c3                    ret 

  -t
  --syms
  打印文件的符号表。这类似于 nm 程序提供的信息,尽管显示格式有所不同。
  
  -T
  --dynamic-syms
  打印文件的动态符号表

  学习过程中发现-t 是包含-T结果的

  关于符号的详细内容,参见https://blog.csdn.net/SimpleForest/article/details/138373339?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22138373339%22%2C%22source%22%3A%22SimpleForest%22%7D

  本文测试代码:https://download.csdn.net/download/SimpleForest/89251966

  

这篇关于objdump命令解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956632

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1