Objdump

objdump是在类Unix操作系统上显示关于目标文件的各种信息的命令行程序。例如，它可用作反汇编器来以汇编代码形式查看可执行文件。它是GNU Binutils的一部分，用于在可执行文件和其他二进制数据上进行精细粒度控制。objdump使用BFD库来读取目标文件的内容。类似工具还有readelf、Microsoft DUMPBIN和Borland TDUMP。
注意在特定平台（比如Mac OS X）上，objdump二进制文件可能实际上被连接到LLVM的objdump，它有着不同的命令选项和表现。
例子.
比如对nm条目的例子代码编译成的目标文件codice_1：
<syntaxhighlight lang="console">
$ gcc -c test.c
</syntaxhighlight>
执行如下命令：
<syntaxhighlight lang="console">
$ objdump -t test.o
</syntaxhighlight>
显示符号表的内容：
<syntaxhighlight lang="objdump">
test.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 test.c
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 l d .bss 0000000000000000 .bss
0000000000000004 l O .bss 0000000000000004 static_var
0000000000000004 l O .data 0000000000000004 static_var_init
0000000000000000 l F .text 000000000000000f static_function
0000000000000008 l O .bss 0000000000000004 local_static_var.1
0000000000000008 l O .data 0000000000000004 local_static_var_init.0
0000000000000000 g O .bss 0000000000000004 global_var
0000000000000000 g O .data 0000000000000004 global_var_init
000000000000000f g F .text 0000000000000024 global_function
0000000000000033 g F .text 0000000000000012 global_function2
0000000000000045 g F .text 000000000000000b non_mangled_function
0000000000000050 g F .text 0000000000000023 main
</syntaxhighlight>
当第3列为codice_2时第5列为对齐，当第3列为codice_3时第5列为大小。
接着执行如下命令：
<syntaxhighlight lang="console">
$ objdump -t test.o | awk '$3=="O" {print $0}' | sort -k4,4
</syntaxhighlight>
从符号表中检索出同BSS节和数据节有关的内容：
<syntaxhighlight lang="objdump">
0000000000000000 g O .bss 0000000000000004 global_var
0000000000000004 l O .bss 0000000000000004 static_var
0000000000000008 l O .bss 0000000000000004 local_static_var.1
0000000000000000 g O .data 0000000000000004 global_var_init
0000000000000004 l O .data 0000000000000004 static_var_init
0000000000000008 l O .data 0000000000000004 local_static_var_init.0
</syntaxhighlight>
接着执行如下命令：
<syntaxhighlight lang="console">
$ objdump -r -j.text test.o
</syntaxhighlight>
显示正文节的记录：
<syntaxhighlight lang="objdump">
test.o: file format elf64-x86-64
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
000000000000001f R_X86_64_PC32 .bss+0x0000000000000004
0000000000000025 R_X86_64_PC32 .data+0x0000000000000004
000000000000002b R_X86_64_PC32 .bss+0x0000000000000004
000000000000005a R_X86_64_PC32 global_var-0x0000000000000008
0000000000000064 R_X86_64_PC32 .bss-0x0000000000000004
</syntaxhighlight>
这里重定位类型中的codice_4指示程序计数器。
接着执行如下命令：
<syntaxhighlight lang="console">
</syntaxhighlight>
这里的codice_5选项指定反汇编包含指令的章节，而codice_6选项在此指定在需要重定位的空位处，标示出对应的重定位项目。这里使用codice_7选项选用intel语法展示汇编代码，默认将用AT&T语法展示。结果输出为：
<syntaxhighlight lang="objdump-nasm">
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <static_function>:
000000000000000f <global_function>:
 1f: R_X86_64_PC32 .bss+0x4
 25: R_X86_64_PC32 .data+0x4
 2b: R_X86_64_PC32 .bss+0x4
0000000000000033 <global_function2>:
0000000000000045 <non_mangled_function>:
0000000000000050 <main>:
 5a: R_X86_64_PC32 global_var-0x8
 64: R_X86_64_PC32 .bss-0x4
</syntaxhighlight>
由于需要加上当前指令长度，这里的codice_8和codice_9处空位重定位为codice_10，它加上codice_11对应codice_12处的codice_13；codice_14处空位重定位为codice_15，它加上codice_11对应codice_17处的codice_18；codice_19处空位重定位为codice_20，它加上codice_21对应codice_22处的codice_23；codice_24处空位重定位为codice_25，它加上codice_21对应codice_10处的codice_28。
将例子源文件编译为位置无关代码：
<syntaxhighlight lang="console">
$ gcc -fPIC -c test.c
</syntaxhighlight>
接着执行如下命令：
<syntaxhighlight lang="console">
$ objdump -r -j.text test.o
</syntaxhighlight>
显示正文节的重定位记录：
<syntaxhighlight lang="objdump">
test.o: file format elf64-x86-64
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
000000000000001f R_X86_64_PC32 .bss+0x0000000000000004
0000000000000025 R_X86_64_PC32 .data+0x0000000000000004
000000000000002b R_X86_64_PC32 .bss+0x0000000000000004
000000000000005b R_X86_64_REX_GOTPCRELX global_var-0x0000000000000004
0000000000000067 R_X86_64_PC32 .bss-0x0000000000000004
</syntaxhighlight>
这里重定位类型中的codice_29指示。
反汇编并提取其中的codice_30函数部份：
<syntaxhighlight lang="console">
$ objdump -d -r -M intel test.o | grep '<main>' -A12
</syntaxhighlight>
结果为：
<syntaxhighlight lang="objdump-nasm">
0000000000000050 <main>:
 5b: R_X86_64_REX_GOTPCRELX global_var-0x4
 67: R_X86_64_PC32 .bss-0x4
</syntaxhighlight>
将上述目标文件链接为共享库：
<syntaxhighlight lang="console">
$ gcc -shared -o test.so test.o
</syntaxhighlight>
接着查看GOT节的位置及其内容：
<syntaxhighlight lang="console">
$ objdump -s -j.got test.so
</syntaxhighlight>
结果为：
<syntaxhighlight lang="objdump">
test.so: file format elf64-x86-64
Contents of section .got:
</syntaxhighlight>
这里的全局偏移量表的位置在codice_31，它有5个项目并且其内容在未运行时都为空。
反汇编并提取其中的codice_30函数部份：
<syntaxhighlight lang="console">
$ objdump -d -M intel test.so | grep '<main>' -A10
</syntaxhighlight>
结果为：
<syntaxhighlight lang="objdump-nasm">
0000000000001149 <main>:
</syntaxhighlight>
这里的codice_33得到codice_31，它是全局偏移量表的第一个项目的地址。
接着查看动态重定位记录：
<syntaxhighlight lang="console">
$ objdump -R test.so
</syntaxhighlight>
结果为：
<syntaxhighlight lang="objdump">
test.so: file format elf64-x86-64
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
0000000000003e60 R_X86_64_RELATIVE *ABS*+0x00000000000010f0
0000000000003e68 R_X86_64_RELATIVE *ABS*+0x00000000000010b0
0000000000004000 R_X86_64_RELATIVE *ABS*+0x0000000000004000
0000000000003fc0 R_X86_64_GLOB_DAT global_var
0000000000003fc8 R_X86_64_GLOB_DAT __cxa_finalize
0000000000003fd0 R_X86_64_GLOB_DAT _ITM_registerTMCloneTable
0000000000003fd8 R_X86_64_GLOB_DAT _ITM_deregisterTMCloneTable
0000000000003fe0 R_X86_64_GLOB_DAT __gmon_start__
</syntaxhighlight>
这里指定了GOT表项目对应的动态符号。这里的处在codice_31的全局偏移量表的第一个项目，在运行时需要重定位为codice_23的实际地址。
接着查看动态符号表：
<syntaxhighlight lang="console">
$ objdump -T test.so
</syntaxhighlight>
结果为：
<syntaxhighlight lang="objdump">
test.so: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000000000 w D *UND* 0000000000000000 __cxa_finalize
0000000000000000 w D *UND* 0000000000000000 _ITM_registerTMCloneTable
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
000000000000112c g DF .text 0000000000000012 global_function2
000000000000113e g DF .text 000000000000000b non_mangled_function
0000000000004008 g DO .data 0000000000000004 global_var_init
0000000000001149 g DF .text 0000000000000026 main
0000000000001108 g DF .text 0000000000000024 global_function
0000000000004018 g DO .bss 0000000000000004 global_var
</syntaxhighlight>
这里指定了实际地址对应的动态符号。这里的codice_23的地址是codice_38。
接着执行如下命令：
<syntaxhighlight lang="console">
$ objdump -t test.so | grep 'global_var$'
</syntaxhighlight>
从符号表中检视codice_23的实际地址：
<syntaxhighlight lang="objdump">
0000000000004018 g O .bss 0000000000000004 global_var
</syntaxhighlight>
动态符号表中codice_23的地址也是这个地址。