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

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.