GCC详解-Binutils工具之objdump

1、介绍

objdump是用查看目标文件或者可执行的目标文件的构成的工具。

2、参数

选项

详细选项

描述

-a

--archive-headers

显示档案库的成员信息,类似 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++函数名以可理解的方式显示出来。

-g

--debugging

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

-e

--debugging-tags

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

-d

--disassemble

从 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 选项列出这里能够指定的架构.

-r

--reloc

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

-R

--dynamic-reloc

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

-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 选项载入

3、例子

3.1 显示文件头信息

$ objdump main.o -h

main.o:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         0000002a  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000010  0000000000000000  0000000000000000  00000070  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, DATA
  2 .bss          00000000  0000000000000000  0000000000000000  00000080  2**0
                  ALLOC
  3 .rodata       00000015  0000000000000000  0000000000000000  00000080  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .comment      00000036  0000000000000000  0000000000000000  00000095  2**0
                  CONTENTS, READONLY
  5 .note.GNU-stack 00000000  0000000000000000  0000000000000000  000000cb  2**0
                  CONTENTS, READONLY
  6 .eh_frame     00000038  0000000000000000  0000000000000000  000000d0  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

3.2 输出目标文件的符号表

$ objdump main.o -t

main.o:     file format elf64-x86-64

SYMBOL TABLE:
0000000000000000 l    df *ABS*    0000000000000000 main.c
0000000000000000 l    d  .text    0000000000000000 .text
0000000000000000 l    d  .data    0000000000000000 .data
0000000000000000 l    d  .bss    0000000000000000 .bss
0000000000000000 l    d  .rodata    0000000000000000 .rodata
0000000000000000 l    d  .note.GNU-stack    0000000000000000 .note.GNU-stack
0000000000000000 l    d  .eh_frame    0000000000000000 .eh_frame
0000000000000000 l    d  .comment    0000000000000000 .comment
0000000000000004       O *COM*    0000000000000004 bbb
0000000000000000 g     O .data    0000000000000004 ccc
0000000000000008 g     O .data    0000000000000008 ddd
0000000000000000 g     F .text    000000000000002a main
0000000000000000         *UND*    0000000000000000 printf

3.3 反汇编

$ objdump main.o -d

main.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
   0:    55                       push   %rbp
   1:    48 89 e5                 mov    %rsp,%rbp
   4:    48 83 ec 10              sub    $0x10,%rsp
   8:    c7 45 fc 0a 00 00 00     movl   $0xa,-0x4(%rbp)
   f:    8b 45 fc                 mov    -0x4(%rbp),%eax
  12:    89 c6                    mov    %eax,%esi
  14:    bf 00 00 00 00           mov    $0x0,%edi
  19:    b8 00 00 00 00           mov    $0x0,%eax
  1e:    e8 00 00 00 00           callq  23 <main+0x23>
  23:    b8 00 00 00 00           mov    $0x0,%eax
  28:    c9                       leaveq 
  29:    c3                       retq 

3.4 显示指定段的信息

$ objdump -s -j .comment main.o

main.o:     file format elf64-x86-64

Contents of section .comment:
 0000 00474343 3a202855 62756e74 7520352e  .GCC: (Ubuntu 5.
 0010 342e302d 36756275 6e747531 7e31362e  4.0-6ubuntu1~16.
 0020 30342e31 32292035 2e342e30 20323031  04.12) 5.4.0 201
 0030 36303630 3900                        60609.          

$ objdump -s -j .text main.o

main.o:     file format elf64-x86-64

Contents of section .text:
 0000 554889e5 4883ec10 c745fc0a 0000008b  UH..H....E......
 0010 45fc89c6 bf000000 00b80000 0000e800  E...............
 0020 000000b8 00000000 c9c3               ..........  

$ objdump -S -j .text main.o

main.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
   0:    55                       push   %rbp
   1:    48 89 e5                 mov    %rsp,%rbp
   4:    48 83 ec 10              sub    $0x10,%rsp
   8:    c7 45 fc 0a 00 00 00     movl   $0xa,-0x4(%rbp)
   f:    8b 45 fc                 mov    -0x4(%rbp),%eax
  12:    89 c6                    mov    %eax,%esi
  14:    bf 00 00 00 00           mov    $0x0,%edi
  19:    b8 00 00 00 00           mov    $0x0,%eax
  1e:    e8 00 00 00 00           callq  23 <main+0x23>
  23:    b8 00 00 00 00           mov    $0x0,%eax
  28:    c9                       leaveq 
  29:    c3                       retq   

注:不能单独使用-j .xxx段,必须加上对这个段有什么操作的参数,比如-s、-S等。

猜你喜欢

转载自blog.csdn.net/sjwangjinbao/article/details/119084257