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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象