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={"type"%3A"blog"%2C"rType"%3A"article"%2C"rId"%3A"138373339"%2C"source"%3A"SimpleForest"}

本文测试代码:https://download.csdn.net/download/SimpleForest/89251966

相关推荐
云满笔记1 年前
Linux 调试 (objdump/strace/strings)
debug·objdump·dev·strace·strings
chaoguo12341 年前
Mach-O Inside: 命令行工具集 otool objdump od 与 dwarfdump
od·otool·objdump·dwarfdump