本文主要是介绍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
这篇关于objdump命令解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!