Linux objdump 命令

Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。本文主要介绍Linux objdump 命令。

1、命令简介

objdump:用于分析二进制目标文件的实用程序,它可以在Linux系统中使用。主要用于查看目标文件的信息,包括头部信息、符号表、代码段反汇编等

2、命令语法

objdump [-a|--archive-headers]
[-b bfdname|--target=bfdname]
[-C|--demangle[=style] ]
[-d|--disassemble]
[-D|--disassemble-all]
[-z|--disassemble-zeroes]
[-EB|-EL|--endian={big | little }]
[-f|--file-headers]
[--file-start-context]
[-g|--debugging]
[-e|--debugging-tags]
[-h|--section-headers|--headers]
[-i|--info]
[-j section|--section=section]
[-l|--line-numbers]
[-S|--source]
[-m machine|--architecture=machine]
[-M options|--disassembler-options=options]
[-p|--private-headers]
[-r|--reloc]
[-R|--dynamic-reloc]
[-s|--full-contents]
[-W|--dwarf]
[-G|--stabs]
[-t|--syms]
[-T|--dynamic-syms]
[-x|--all-headers]
[-w|--wide]
[--start-address=address]
[--stop-address=address]
[--prefix-addresses]
[--[no-]show-raw-insn]
[--adjust-vma=offset]
[--special-syms]
[-V|--version]
[-H|--help]
objfile...

3、命令描述

objdump显示有关一个或多个目标文件的信息。选项控制要显示的特定信息。这些信息对于正在开发编译工具的程序员非常有用,而不适用于只希望编译并运行其程序的程序员。

objfile... 是要检查的目标文件。当您指定存档文件时,objdump 显示每个成员目标文件的信息。

4、命令选项

选项

描述

--archive-headers

-a

显示档案库的成员信息,类似于使用

ls -l

显示lib*.a的信息。

-b bfdname

--target=bfdname

--target=bfdname 指定目标码格式。

这不是必须的,objdump 能自动识别许多格式。

-C

--demangle

将底层的符号名解码成用户级名字,

使得 C++ 函数名以可理解的方式显示出来。

--debugging

-g

显示调试信息,企图解析保存在文件中的调试信息

并以 C 语言的语法显示出来。

-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 一起使用。

-m machine

--architecture=machine

指定反汇编目标文件时使用的架构,

当待反汇编文件本身没描述架构信息的时候很有用。

--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

版本信息。

--all-headers

显示所可用的头信息,包括符号表、重定位入口。

-x 等价于 -a -f -h -r -t 同时指定。

-z

--disassemble-zeroes

一般反汇编输出将省略大块的零,

该选项使得这些零块也被反汇编。

@file

可以将选项集中到一个文件中,

然后使用这个 @file 选项载入。

5、使用示例

1)查看目标文件头部信息:

objdump -h <filename>

显示目标文件的头部信息,包括各个段(section)的大小、地址、偏移等。

2)查看目标文件的符号表:

objdump -t <filename>

显示目标文件的符号表,包括函数名、变量名以及它们的地址。

3)反汇编代码段

objdump -d <filename>

反汇编目标文件的代码段,显示汇编指令,可以用于分析程序的执行流程。

4)查看重定位入口

objdump -r <filename>

显示目标文件的重定位入口,包括需要在链接时解析的符号引用。

5)以指定格式反汇编

objdump -M <architecture> -D <filename>

指定要使用的架构来反汇编目标文件。

6)查看所有头信息

objdump -x <filename>

显示目标文件的所有头信息,包括符号表、重定位入口等。

7)反汇编特定段

objdump -j <section_name> -d <filename>

只反汇编特定段的内容,而不是整个文件。

推荐阅读
cjavapy编程之路首页