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

  

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

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

相关文章

全方位了解 Meta Llama 3

本文将为您提供 Llama 3 的全面概览&#xff0c;从其架构、性能到未来的发展方向&#xff0c;让您一文了解这一革命性大语言模型的所有要点。 Meta Llama 发展历程 Llama 1 Llama 是由 Meta(FaceBook) AI 发布的一个开源项目&#xff0c;允许商用&#xff0c;影响力巨大。Lla…

力扣每日一题111:二叉树的最小深度

题目 简单 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2示例 2&#x…

C语言:文件操作(上)

片头 嗨&#xff01;小伙伴们&#xff0c;今天我们来学习新的知识----文件操作&#xff0c;准备好了吗&#xff1f;我要开始咯! 目录 1. 为什么使用文件&#xff1f; 2. 什么是文件&#xff1f; 3. 二进制文件和文本文件&#xff1f; 4. 文件的打开和关闭 5. 文件顺序读写…

启发式算法解魔方——python

未完待续&#xff0c;填坑ing…… 魔方操作的表示——辛马斯特标记 辛马斯特标记&#xff08;Singmaster Notation&#xff09;是一种用于描述魔方和类似拼图的转动操作的标记系统。它以大卫辛马斯特&#xff08;David Singmaster&#xff09;的名字命名&#xff0c;辛马斯特…

C 认识指针

目录 一、取地址操作符&#xff08;&&#xff09; 二、解引用操作符&#xff08;*&#xff09; 三、指针变量 1、 指针变量的大小 2、 指针变量类型的意义 2.1 指针的解引用 2.2 指针 - 整数 2.3 调试解决疑惑 认识指针&#xff0c;指针比较害羞内敛&#xff0c;我们…

单调栈-java

本次主要通过数组模拟单调栈来解决问题。 目录 一、单调栈☀ 二、算法思路☀ 1.暴力做法&#x1f319; 2.优化做法&#x1f319; 3.单调递增栈和单调递减栈&#x1f319; 三、代码如下☀ 1.代码如下&#xff08;示例&#xff09;&#xff1a;&#x1f319; 2.读入数据&a…

Ubuntu MATE系统下WPS显示错位

系统&#xff1a;Ubuntu MATE 22.04和24.04&#xff0c;在显示器设置200%放大的情况下&#xff0c;显示错位。 显示器配置&#xff1a; WPS显示错位&#xff1a; 这个问题当前没有找到好的解决方式。 因为4K显示屏设置4K分辨率&#xff0c;图标&#xff0c;字体太小&#xff…

prometheus搭建

1.prometheus下载 下载地址:Download | Prometheus 请下载LTS稳定版本 本次prometheus搭建使用prometheus-2.37.1.linux-amd64.tar.gz版本 2.上传prometheus-2.37.1.linux-amd64.tar.gz至服务器/opt目录 CentOS7.9 使用命令rz -byE上传 3.解压缩prometheus-2.37.1.linux…

【C++之map的应用】

C学习笔记---021 C之map的应用1、map的简单介绍1.1、基本概念1.2、map基本特性 2、map的基本操作2.1、插入元素2.2、访问元素2.3、删除元素2.4、遍历map2.5、检查元素是否存在2.6、获取map的大小2.7、清空map2.8、基本样例 3、map的基础模拟实现4、测试用例4.1、插入和遍历4.2、…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝

Flutter笔记 Widgets Easier组件库&#xff08;11&#xff09;使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

【多模态】29、OCRBench | 为大型多模态模型提供一个 OCR 任务测评基准

文章目录 一、背景二、实验2.1 测评标准和结果2.1.1 文本识别 Text Recognition2.1.2 场景文本中心的视觉问答 Scene Text-Centric VQA2.1.3 文档导向的视觉问答 Document-Oriented VQA2.1.4 关键信息提取 Key Information Extraction2.1.5 手写数学公式识别 Handwritten Mathe…

Ubuntu安装配置网络

参考 https://blog.csdn.net/qq_59633155/article/details/131252293https://blog.csdn.net/qq_59633155/article/details/131252293 Ubuntu配置网络 1&#xff0c;查看网络是否连接 终端输入 ping baidu.com 如若成功则如下图所示 如未能成功&#xff0c;则继续按下面步骤…

解决HTTP 403 Forbidden错误:禁止访问目录索引问题的解决方法

解决HTTP 403 Forbidden错误&#xff1a;禁止访问目录索引问题的解决方法 过去有人曾对我说&#xff0c;“一个人爱上小溪&#xff0c;是因为没有见过大海。”而如今我终于可以说&#xff0c;“我已见过银河&#xff0c;但我仍只爱你一颗星。” 在Web开发和服务器管理中&#x…

【精品毕设推荐】基于JSP物流信息网的设计与实现

点击免费下载原文及代码、PPT 摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发&#xff0c;使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主…

(三)JVM实战——对象的内存布局与执行引擎详解

对象的内存布局 对象的实例化 对象的创建方式 - new的方式 - Class的newInstance():反射的方式 - Construct的newInstance() - clone:实现Cloneable接口,默认浅拷贝 - 使用反序列化&#xff1a;将二进制流转化为内存对象 创建对象的步骤 - 判断对象对应的类是否加载、链接、初…

You don’t have permission.

The document “XXX” could not be saved. You don’t have permission. 1.查看修改了iOS系统库导致的, 根据提示, 进入到"XXX"文件中, 然后commandz回退/取消 2. Xcode 调试遇到的报错&#xff08;持续更新&#xff09;

18_Scala面向对象编程trait

文章目录 trait1.定义trait2.向类中混入特质2.1没有父类2.2有父类 3.动态混入3.1动态混入查询功能到公司业务中 4.父类&#xff0c;子类&#xff0c;特质初始化优先级5.Scala功能执行顺序6.常用API trait –特质的学习需要类比Java中的接口&#xff0c;源码编译之后就是interf…

练习题(2024/5/3)

1对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中…

(论文阅读-优化器)A Cost Model for SPARK SQL

目录 Abstract 1 Introduction 2 Related Work 3 Background and Spark Basics 4 Cost Model Basic Bricks 4.1 Cluster Abastraction and Cost Model Parameters 4.2 Read 4.3 Write 4.4 Shuffle Read 4.5 Broadcast 5 Modeling GPSJ Queries 5.1 Statistics and S…

QT+网络调试助手+TCP客户端

一、网络调试助手UI界面 编程主要思路&#xff1a; 首先将水平的控件 水平布局 &#xff0c;然后相对垂直的控件 垂直布局 &#xff0c;哪怕是底下的groupBox也需要和里面的内容 水平布局&#xff0c;然后最后框选全部 栅格布局。如果需要界面自适应窗口大小&#xff0c…