`
vaqeteart
  • 浏览: 304105 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

objdump

 
阅读更多
objdump [选项] objfile...
[功能]
显示二进制文件信息

[描述](待整理)
objdump用来显示一个或者多个目标文件的信息。使用选项控制具体显示哪些信息。参数objfile...可以是静态库归档文件。
下面是一些常见的选项:
--archive-headers
-a
显示档案库的成员信息,类似ls -l将lib*.a的信息列出。

-b bfdname
--target=bfdname
指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如:
objdump -b oasys -m vax -h fu.o
显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。

-C
--demangle
将底层的符号名解码成用户级名字,除了去掉所有开头的下划线之外,还使得C++函数名以可理解的方式显示出来。

--debugging
-g
显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。

-e
--debugging-tags
类似-g选项,但是生成的信息是和ctags工具相兼容的格式。

--disassemble
-d
从objfile中反汇编那些特定指令机器码的section。

-D
--disassemble-all
与 -d 类似,但反汇编所有section.

--prefix-addresses
反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。

-EB
-EL
--endian={big|little}
指定目标文件的小端。这个选项将影响反汇编出来的指令。在反汇编的文件没有描述小端信息的时候有用。例如S-records.

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

-h
--section-headers
--headers
显示目标文件各个section的头部摘要信息。

-H
--help
简短的帮助信息。

-i
--info
显示对于 -b 或者 -m 选项可用的架构和目标格式列表。

-j name
--section=name
仅仅显示指定名称为name的section的信息

-l
--line-numbers
用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。

-m machine
--architecture=machine
指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构.

--reloc
-r
显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。

--dynamic-reloc
-R
显示文件的动态重定位入口,仅仅对于动态目标文件有意义,比如某些共享库。

-s
--full-contents
显示指定section的完整内容。默认所有的非空section都会被显示。

-S
--source
尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。

--show-raw-insn
反汇编的时候,显示每条汇编指令对应的机器码,如不指定--prefix-addresses,这将是缺省选项。

--no-show-raw-insn
反汇编时,不显示汇编指令的机器码,如不指定--prefix-addresses,这将是缺省选项。

--start-address=address
从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。

--stop-address=address
显示数据直到指定地址为止,该选项影响-d、-r和-s选项的输出。

-t
--syms
显示文件的符号表入口。类似于nm -s提供的信息

-T
--dynamic-syms
显示文件的动态符号表入口,仅仅对动态目标文件有意义,比如某些共享库。它显示的信息类似于 nm -D|--dynamic 显示的信息。

-V
--version
版本信息

--all-headers
-x
显示所有可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。

-z
--disassemble-zeroes
一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。

@file 可以将选项集中到一个文件中,然后使用这个@file选项载入。

[举例]
首先,在给出后面大部分测试所基于的源代码以及编译指令。
源代码如下:
[root@lv-k 04_libraryTest]# nl mytest.cpp
     1  void printTest()
     2  {
     3          char a;
     4          a = 'a';
     5  }
     6  void printTest2()
     7  {
     8          int a = 2;
     9          a+=2;
    10  }
对以上源代码进行编译,如下:
[root@lv-k 04_libraryTest]# g++ -c -g mytest.cpp
这里,生成的文件是mytest.o,为了方便测试包含了调试的信息,对可执行文件的测试,显示的结果类似。

*查看当前使用的objdump的版本号:
[root@lv-k 04_libraryTest]# objdump -V
输入之后输出如下:
GNU objdump 2.17.50.0.6-14.el5 20061020
Copyright 2005 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License.  This program has absolutely no warranty.

*查看档案库文件中的信息:
[root@lv-k 04_libraryTest]# objdump -a libmy2.a
输入之后输出如下:
In archive libmy2.a:

myfile.o:     file format elf32-i386
rwxrwxrwx 0/0   2724 Nov 16 16:06 2009 myfile.o


mytest.o:     file format elf32-i386
rw-r--r-- 0/0    727 Jul 13 15:32 2011 mytest.o
这里,libmy2.a是一个使用ar命令将多个*.o目标文件打包而生成的静态库。命令的输出类似"ar -tv",相比较"ar -tv"输出如下:
[root@lv-k 04_libraryTest]# ar -tv libmy2.a
rwxrwxrwx 0/0   2724 Nov 16 16:06 2009 myfile.o
rw-r--r-- 0/0    727 Jul 13 15:32 2011 mytest.o


*显示可用的架构和目标结构列表:
[root@lv-k 04_libraryTest]# objdump -i
输入之后输出如下:
BFD header file version 2.17.50.0.6-14.el5 20061020
elf32-i386
(header little endian, data little endian)
  i386
a.out-i386-linux
(header little endian, data little endian)
  i386
efi-app-ia32
(header little endian, data little endian)
  i386
elf64-x86-64
(header little endian, data little endian)
  i386
elf64-little
(header little endian, data little endian)
  i386
elf64-big
(header big endian, data big endian)
  i386
elf32-little
(header little endian, data little endian)
  i386
elf32-big
(header big endian, data big endian)
  i386
srec
(header endianness unknown, data endianness unknown)
  i386
symbolsrec
(header endianness unknown, data endianness unknown)
  i386
tekhex
(header endianness unknown, data endianness unknown)
  i386
binary
(header endianness unknown, data endianness unknown)
  i386
ihex
(header endianness unknown, data endianness unknown)
  i386
trad-core
(header endianness unknown, data endianness unknown)

               elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64
          i386 elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64

               elf64-little elf64-big elf32-little elf32-big srec symbolsrec
          i386 elf64-little elf64-big elf32-little elf32-big srec symbolsrec

               tekhex binary ihex trad-core
          i386 tekhex binary ihex ---------
这里,显示的信息是相对于 -b 或者 -m 选项可用的架构和目标格式列表。

*显示mytest.o文件中的text段的内容:
[root@lv-k 04_libraryTest]# objdump --section=.text -s mytest.o
输入之后输出如下:
mytest.o:     file format elf32-i386

Contents of section .text:
0000 5589e583 ec10c645 ff61c9c3 5589e583  U......E.a..U...
0010 ec10c745 fc020000 008345fc 02c9c3    ...E......E....
这里注意,不能单独使用-j或者--section,例如"objdump --section=.text mytest.o"是不会运行成功的。

*反汇编mytest.o中的text段内容,并尽可能用源代码形式表示:
[root@lv-k 04_libraryTest]# objdump -j .text -S mytest.o
输入之后输出如下:
mytest.o:     file format elf32-i386

Disassembly of section .text:

00000000 <_Z9printTestv>:
void printTest()
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
{
        char a;
        a = 'a';
   6:   c6 45 ff 61             movb   $0x61,0xffffffff(%ebp)
}
   a:   c9                      leave 
   b:   c3                      ret   

0000000c <_Z10printTest2v>:
void printTest2()
   c:   55                      push   %ebp
   d:   89 e5                   mov    %esp,%ebp
   f:   83 ec 10                sub    $0x10,%esp
{
        int a = 2;
  12:   c7 45 fc 02 00 00 00    movl   $0x2,0xfffffffc(%ebp)
        a+=2;
  19:   83 45 fc 02             addl   $0x2,0xfffffffc(%ebp)
}
  1d:   c9                      leave 
  1e:   c3                      ret   
这里注意,不能单独使用-j或者--section,例如"objdump -j .text mytest.o"是不会运行成功的。另外-S命令对于包含调试信息的目标文件,显示的效果比较好,如果编译时没有指定g++的-g选项,那么目标文件就不包含调试信息,那么显示效果就差多了。

*反汇编出mytest.o的源代码:
[root@lv-k 04_libraryTest]# objdump -S mytest.o
输入之后输出如下:
mytest.o:     file format elf32-i386

Disassembly of section .text:

00000000 <_Z9printTestv>:
void printTest()
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
{
        char a;
        a = 'a';
   6:   c6 45 ff 61             movb   $0x61,0xffffffff(%ebp)
}
   a:   c9                      leave 
   b:   c3                      ret   

0000000c <_Z10printTest2v>:
void printTest2()
   c:   55                      push   %ebp
   d:   89 e5                   mov    %esp,%ebp
   f:   83 ec 10                sub    $0x10,%esp
{
        int a = 2;
  12:   c7 45 fc 02 00 00 00    movl   $0x2,0xfffffffc(%ebp)
        a+=2;
  19:   83 45 fc 02             addl   $0x2,0xfffffffc(%ebp)
}
  1d:   c9                      leave 
  1e:   c3                      ret   
这里,尤其当编译的时候指定了-g这种调试参数时,反汇编的效果比较明显。隐含了-d参数。

*显示文件的符号表入口:
[root@lv-k 04_libraryTest]# objdump -t mytest.o
输入之后输出如下:
mytest.o:     file format elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS*  00000000 mytest.cpp
00000000 l    d  .text  00000000 .text
00000000 l    d  .data  00000000 .data
00000000 l    d  .bss   00000000 .bss
00000000 l    d  .debug_abbrev  00000000 .debug_abbrev
00000000 l    d  .debug_info    00000000 .debug_info
00000000 l    d  .debug_line    00000000 .debug_line
00000000 l    d  .debug_frame   00000000 .debug_frame
00000000 l    d  .debug_loc     00000000 .debug_loc
00000000 l    d  .debug_pubnames        00000000 .debug_pubnames
00000000 l    d  .debug_aranges 00000000 .debug_aranges
00000000 l    d  .note.GNU-stack        00000000 .note.GNU-stack
00000000 l    d  .comment       00000000 .comment
00000000 g     F .text  0000000c _Z9printTestv
00000000         *UND*  00000000 __gxx_personality_v0
0000000c g     F .text  00000013 _Z10printTest2v
这里,输出的信息类似"nm -s"命令的输出,相比较之下,nm命令的输出如下:
[root@lv-k 04_libraryTest]# nm -s mytest.o
0000000c T _Z10printTest2v
00000000 T _Z9printTestv
         U __gxx_personality_v0

*显示文件的符号表入口,将底层符号解码并表示成用户级别:
[root@lv-k 04_libraryTest]# objdump -t -C mytest.o
输入之后输出如下:
mytest.o:     file format elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS*  00000000 mytest.cpp
00000000 l    d  .text  00000000 .text
00000000 l    d  .data  00000000 .data
00000000 l    d  .bss   00000000 .bss
00000000 l    d  .debug_abbrev  00000000 .debug_abbrev
00000000 l    d  .debug_info    00000000 .debug_info
00000000 l    d  .debug_line    00000000 .debug_line
00000000 l    d  .debug_frame   00000000 .debug_frame
00000000 l    d  .debug_loc     00000000 .debug_loc
00000000 l    d  .debug_pubnames        00000000 .debug_pubnames
00000000 l    d  .debug_aranges 00000000 .debug_aranges
00000000 l    d  .note.GNU-stack        00000000 .note.GNU-stack
00000000 l    d  .comment       00000000 .comment
00000000 g     F .text  0000000c printTest()
00000000         *UND*  00000000 __gxx_personality_v0
0000000c g     F .text  00000013 printTest2()
这里,和没有-C相比,printTest2函数可读性增加了。


*反汇编目标文件的特定机器码段:
[root@lv-k 04_libraryTest]# objdump -d mytest.o
输入之后输出如下:
mytest.o:     file format elf32-i386

Disassembly of section .text:

00000000 <_Z9printTestv>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
   6:   c6 45 ff 61             movb   $0x61,0xffffffff(%ebp)
   a:   c9                      leave 
   b:   c3                      ret   

0000000c <_Z10printTest2v>:
   c:   55                      push   %ebp
   d:   89 e5                   mov    %esp,%ebp
   f:   83 ec 10                sub    $0x10,%esp
  12:   c7 45 fc 02 00 00 00    movl   $0x2,0xfffffffc(%ebp)
  19:   83 45 fc 02             addl   $0x2,0xfffffffc(%ebp)
  1d:   c9                      leave 
  1e:   c3                      ret   
这里,对text段的内容进行了反汇编。

*反汇编特定段,并将汇编代码对应的文件名称和行号对应上:
[root@lv-k 04_libraryTest]# objdump -d -l mytest.o
输入之后输出如下:
mytest.o:     file format elf32-i386

Disassembly of section .text:

00000000 <_Z9printTestv>:
_Z9printTestv():
/root/test/04_libraryTest/mytest.cpp:1
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
/root/test/04_libraryTest/mytest.cpp:4
   6:   c6 45 ff 61             movb   $0x61,0xffffffff(%ebp)
/root/test/04_libraryTest/mytest.cpp:5
   a:   c9                      leave 
   b:   c3                      ret   

0000000c <_Z10printTest2v>:
_Z10printTest2v():
/root/test/04_libraryTest/mytest.cpp:6
   c:   55                      push   %ebp
   d:   89 e5                   mov    %esp,%ebp
   f:   83 ec 10                sub    $0x10,%esp
/root/test/04_libraryTest/mytest.cpp:8
  12:   c7 45 fc 02 00 00 00    movl   $0x2,0xfffffffc(%ebp)
/root/test/04_libraryTest/mytest.cpp:9
  19:   83 45 fc 02             addl   $0x2,0xfffffffc(%ebp)
/root/test/04_libraryTest/mytest.cpp:10
  1d:   c9                      leave 
  1e:   c3                      ret   
这里,选项"-d"从objfile中反汇编那些特定指令机器码的section,而使用"-l"指定用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用,使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。

*显示目标文件各个段的头部摘要信息:
[root@lv-k 04_libraryTest]# objdump -h mytest.o
输入之后输出如下:
mytest.o:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000001f  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000054  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000054  2**2
                  ALLOC
  3 .debug_abbrev 00000046  00000000  00000000  00000054  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_info   000000ed  00000000  00000000  0000009a  2**0
                  CONTENTS, RELOC, READONLY, DEBUGGING
  5 .debug_line   0000003e  00000000  00000000  00000187  2**0
                  CONTENTS, RELOC, READONLY, DEBUGGING
  6 .debug_frame  00000044  00000000  00000000  000001c8  2**2
                  CONTENTS, RELOC, READONLY, DEBUGGING
  7 .debug_loc    00000058  00000000  00000000  0000020c  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_pubnames 0000002f  00000000  00000000  00000264  2**0
                  CONTENTS, RELOC, READONLY, DEBUGGING
  9 .debug_aranges 00000020  00000000  00000000  00000293  2**0
                  CONTENTS, RELOC, READONLY, DEBUGGING
10 .comment      0000002e  00000000  00000000  000002b3  2**0
                  CONTENTS, READONLY
11 .note.GNU-stack 00000000  00000000  00000000  000002e1  2**0
                  CONTENTS, READONLY
这里,更多的内容参见"man objdump"中的这个选项。

[其它]
更多的命令参见"man objdump"

参考:
http://www.cnblogs.com/amethyst623/articles/1946499.html
http://blog.csdn.net/babylon_0049/article/details/4092978
分享到:
评论

相关推荐

    linux基础进阶笔记

    linux基础进阶笔记,配套视频:https://www.bilibili.com/list/474327672?sid=4493093&spm_id_from=333.999.0.0&desc=1

    IMG20241115211541.jpg

    IMG20241115211541.jpg

    Sen2_ARI_median.txt

    GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载

    毕业设计&课设_基于 flask-whoosh-jieba 的代码,涉及文件管理及问题修复.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    基于springboot家政预约平台源码数据库文档.zip

    基于springboot家政预约平台源码数据库文档.zip

    Ucharts添加stack和折线图line的混合图

    Ucharts添加stack和折线图line的混合图

    基于springboot员工在线餐饮管理系统源码数据库文档.zip

    基于springboot员工在线餐饮管理系统源码数据库文档.zip

    2015-2021年新能源汽车分地区、分类型、分级别销量逐月数据和进出口数据-最新出炉.zip

    新能源汽车进出口数据 1、时间跨度:2018-2020年 2、指标说明:包含如下指标的进出口数据:混合动力客车(10座及以上)、纯电动客车(10座及以上)、非插电式混合动力乘用车、插电式混合动力乘用车、纯电动乘用车 二、新能源汽车进出口月销售数据(分地区、分类型、分 级别) 1、数据来源:见资料内说明 2、时间跨度:2014年1月-2021年5月 4、指标说明: 包含如下指标 2015年1月-2021年5月新能源乘用车终端月度销量(分类型)部分内容如下: 新能源乘用车(单月值、累计值 )、插电式混合动力 月度销量合计(狭义乘用车轿车、SUV、MPV、交叉型乘用车); 月度销量同比增速(狭义乘用车轿车、SUV、MPV、交叉型乘用车); 累计销量合计(狭义乘用车轿车、SUV、IPV、交叉型乘用车); 累计销量同比增速(狭义乘用车轿车、SUV、MPV、交叉型乘用车); 累计结构变化(狭义乘用车轿车、SUV、IPV、交叉型乘用车); 2015年1月-2021年5月新能源乘用车终端月度销量(分地区)内容如下: 更多见资源内

    中心主题-241121215200.pdf

    中心主题-241121215200.pdf

    蓝奏云下载链接与密码整理

    内容概要:本文档提供了多个蓝奏云下载链接及其对应解压密码,帮助用户快速获取所需文件。 适合人群:需要从蓝奏云下载文件的互联网用户。 使用场景及目标:方便地记录并分享蓝奏云上文件的下载地址和密码,提高下载效率。 阅读建议:直接查看并使用提供的链接和密码即可。若遇到失效情况,请尝试联系上传者确认更新后的链接。

    Javaweb仓库管理系统项目源码.zip

    基于Java web 实现的仓库管理系统源码,适用于初学者了解Java web的开发过程以及仓库管理系统的实现。

    Python-文件重命名-自定义添加文字-重命名

    资源名称:Python-文件重命名-自定义添加文字-重命名 类型:windows—exe可执行工具 环境:Windows10或以上系统 功能: 1、点击按钮 "源原文"【浏览】表示:选择重命名的文件夹 2、点击按钮 "保存文件夹"【浏览】表示:保存的路径(为了方便可选择保存在 源文件中 ) 3、功能①:在【头部】添加自定义文字 4、功能②:在【尾部】添加自定义文字 5、功能③:输入源字符 ;输入替换字符 可以将源文件中的字符替换自定义的 6、功能④:自动加上编号_1 _2 _3 优点: 1、非常快的速度! 2、已打包—双击即用!无需安装! 3、自带GUI界面方便使用!

    JDK8安装包,为各位学习的朋友免费提供

    JDK8安装包

    Centos-7yum的rpm包

    配合作者 一同使用 作者地址没有次下载路径 https://blog.csdn.net/weixin_52372189/article/details/127471149?fromshare=blogdetail&sharetype=blogdetail&sharerId=127471149&sharerefer=PC&sharesource=weixin_45375332&sharefrom=from_link

    setup_python_geospatial_analysis.ipynb

    GEE训练教程

    毕业设计&课设_文成公主微信公众号全栈工程,含技术栈、架构及部署流程等内容.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    基于springboot交通感知与车路协同系统源码数据库文档.zip

    基于springboot交通感知与车路协同系统源码数据库文档.zip

    基于springboot+vue 雅妮电影票购买系统源码数据库文档.zip

    基于springboot+vue 雅妮电影票购买系统源码数据库文档.zip

    使用 HTML5 实现拖放交互:音效与提示功能的完整实现

    为了更好地理解 HTML5 的拖放功能,我们设计了一个简单有趣的示例:将水果从水果区拖放到购物笼中,实时更新数量和价格,并在所有水果被成功放置后,播放音效并显示提示。

    毕业设计&课设_基于 SSM 的大学生综合成绩测评系统(含信息及数据库脚本,体现系统架构及功能设计).zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

Global site tag (gtag.js) - Google Analytics