objdump 是在類 Unix 作業系統上顯示關於目標檔案的各種資訊的命令列程式。例如，它可用作反彙編器來以彙編程式碼形式檢視可執行檔案。它是 GNU Binutils 的一部分，用於在可執行檔案和其他二進位制資料上進行精細粒度控制。objdump 使用 BFD 庫來讀取目標檔案的內容。類似工具還有 readelf、Microsoft DUMPBIN 和 Borland TDUMP。 注意在特定平臺（比如 Mac OS X）上，objdump 二進位制檔案可能實際上被連線到 LLVM 的 objdump，它有著不同的命令選項和表現。 例子 比如對 nm 條目的例子程式碼編譯成的目標檔案 testo： gcc c testc 執行如下命令： objdump t testo 顯示符號表的內容： testo file format elf64x8664 SYMBOL TABLE 0000000000000000 l df ABS 0000000000000000 testc 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_var1 0000000000000008 l O data 0000000000000004 local_static_var_init0 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 當第 3 列為 O 時第 5 列為對齊，當第 3 列為 F 時第 5 列為大小。 接著執行如下命令： objdump t testo awk 3O print 0 sort k44 從符號表中檢索出同 BSS 節和資料節有關的內容： 0000000000000000 g O bss 0000000000000004 global_var 0000000000000004 l O bss 0000000000000004 static_var 0000000000000008 l O bss 0000000000000004 local_static_var1 0000000000000000 g O data 0000000000000004 global_var_init 0000000000000004 l O data 0000000000000004 static_var_init 0000000000000008 l O data 0000000000000004 local_static_var_init0 接著執行如下命令： objdump r jtext testo 顯示正文節的記錄： testo file format elf64x8664 RELOCATION RECORDS FOR text OFFSET TYPE VALUE 000000000000001f R_X86_64_PC32 bss0x0000000000000004 0000000000000025 R_X86_64_PC32 data0x0000000000000004 000000000000002b R_X86_64_PC32 bss0x0000000000000004 000000000000005a R_X86_64_PC32 global_var0x0000000000000008 0000000000000064 R_X86_64_PC32 bss0x0000000000000004 這裡重定位型別中的 PC 指示程式計數器。 接著執行如下命令： objdump d r M intel testo 這裡的 d 選項指定反彙編包含指令的章節，而 r 選項在此指定在需要重定位的空位處，標示出對應的重定位專案。這裡使用 M intel 選項選用 intel 語法展示彙編程式碼，預設將用 ATT 語法展示。結果輸出為： testo file format elf64x8664 Disassembly of section text 0000000000000000 static_function 0 f3 0f 1e fa endbr64 4 55 push rbp 5 48 89 e5 mov rbprsp 8 b8 00 00 00 00 mov eax0x0 d 5d pop rbp e c3 ret 000000000000000f global_function f f3 0f 1e fa endbr64 13 55 push rbp 14 48 89 e5 mov rbprsp 17 89 7d fc mov DWORD PTR rbp0x4edi 1a 8b 45 fc mov eaxDWORD PTR rbp0x4 1d 89 05 00 00 00 00 mov DWORD PTR rip0x0eax 23 global_function0x14 1f R_X86_64_PC32 bss0x4 23 8b 15 00 00 00 00 mov edxDWORD PTR rip0x0 29 global_function0x1a 25 R_X86_64_PC32 data0x4 29 8b 05 00 00 00 00 mov eaxDWORD PTR rip0x0 2f global_function0x20 2b R_X86_64_PC32 bss0x4 2f 01 d0 add eaxedx 31 5d pop rbp 32 c3 ret 0000000000000033 global_function2 33 f3 0f 1e fa endbr64 37 55 push rbp 38 48 89 e5 mov rbprsp 3b 8b 55 f8 mov edxDWORD PTR rbp0x8 3e 8b 45 fc mov eaxDWORD PTR rbp0x4 41 01 d0 add eaxedx 43 5d pop rbp 44 c3 ret 0000000000000045 non_mangled_function 45 f3 0f 1e fa endbr64 49 55 push rbp 4a 48 89 e5 mov rbprsp 4d 90 nop 4e 5d pop rbp 4f c3 ret 0000000000000050 main 50 f3 0f 1e fa endbr64 54 55 push rbp 55 48 89 e5 mov rbprsp 58 c7 05 00 00 00 00 01 mov DWORD PTR rip0x00x1 62 main0x12 5f 00 00 00 5a R_X86_64_PC32 global_var0x8 62 c7 05 00 00 00 00 02 mov DWORD PTR rip0x00x2 6c main0x1c 69 00 00 00 64 R_X86_64_PC32 bss0x4 6c b8 00 00 00 00 mov eax0x0 71 5d pop rbp 72 c3 ret 由於需要加上當前指令長度，這裡的text0x1f 和text0x2b 處空位重定位為bss0x00000004，它加上 0x04 對應bss0x00000008 處的 local_static_var1；text0x25 處空位重定位為data0x00000004，它加上 0x04 對應data0x00000008 處的 local_static_var_init0；text0x5a 處空位重定位為 global_var0x00000008，它加上 0x08 對應bss0x00000000 處的 global_var；text0x64 處空位重定位為bss0x00000004，它加上 0x08 對應bss0x00000004 處的 static_var。 將例子原始檔編譯為位置無關程式碼： gcc fPIC c testc 接著執行如下命令： objdump r jtext testo 顯示正文節的重定位記錄： testo file format elf64x8664 RELOCATION RECORDS FOR text OFFSET TYPE VALUE 000000000000001f R_X86_64_PC32 bss0x0000000000000004 0000000000000025 R_X86_64_PC32 data0x0000000000000004 000000000000002b R_X86_64_PC32 bss0x0000000000000004 000000000000005b R_X86_64_REX_GOTPCRELX global_var0x0000000000000004 0000000000000067 R_X86_64_PC32 bss0x0000000000000004 這裡重定位型別中的 GOT 指示。 反彙編並提取其中的 main 函式部份： objdump d r M intel testo grep main A12 結果為： 0000000000000050 main 50 f3 0f 1e fa endbr64 54 55 push rbp 55 48 89 e5 mov rbprsp 58 48 8b 05 00 00 00 00 mov raxQWORD PTR rip0x0 5f main0xf 5b R_X86_64_REX_GOTPCRELX global_var0x4 5f c7 00 01 00 00 00 mov DWORD PTR rax0x1 65 c7 05 00 00 00 00 02 mov DWORD PTR rip0x00x2 6f main0x1f 6c 00 00 00 67 R_X86_64_PC32 bss0x4 6f b8 00 00 00 00 mov eax0x0 74 5d pop rbp 75 c3 ret 將上述目標檔案連結為共享庫： gcc shared o testso testo 接著檢視 GOT 節的位置及其內容： objdump s jgot testso 結果為： testso file format elf64x8664 Contents of section got 3fc0 00000000 00000000 00000000 00000000 3fd0 00000000 00000000 00000000 00000000 3fe0 00000000 00000000 這裡的全域性偏移量表的位置在 0x00003fc0，它有 5 個專案並且其內容在未執行時都為空。 反彙編並提取其中的 main 函式部份： objdump d M intel testso grep main A10 結果為： 0000000000001149 main 1149 f3 0f 1e fa endbr64 114d 55 push rbp 114e 48 89 e5 mov rbprsp 1151 48 8b 05 68 2e 00 00 mov raxQWORD PTR rip0x2e68 3fc0 global_var0x58 1158 c7 00 01 00 00 00 mov DWORD PTR rax0x1 115e c7 05 b4 2e 00 00 02 mov DWORD PTR rip0x2eb40x2 401c static_var 1165 00 00 00 1168 b8 00 00 00 00 mov eax0x0 116d 5d pop rbp 116e c3 ret 這裡的 0x11510x070x00002e68 得到 0x00003fc0，它是全域性偏移量表的第一個專案的地址。 接著檢視動態重定位記錄： objdump R testso 結果為： testso file format elf64x8664 DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE 0000000000003e60 R_X86_64_RELATIVE ABS0x00000000000010f0 0000000000003e68 R_X86_64_RELATIVE ABS0x00000000000010b0 0000000000004000 R_X86_64_RELATIVE ABS0x0000000000004000 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__ 這裡指定了 GOT 表專案對應的動態符號。這裡的處在 0x00003fc0 的全域性偏移量表的第一個專案，在執行時需要重定位為 global_var 的實際地址。 接著檢視動態符號表： objdump T testso 結果為： testso file format elf64x8664 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 這裡指定了實際地址對應的動態符號。這裡的 global_var 的地址是 0x0000000000004018。 接著執行如下命令： objdump t testso grep global_var 從符號表中檢視 global_var 的實際地址： 0000000000004018 g O bss 0000000000000004 global_var 動態符號表中 global_var 的地址也是這個地址。 參見 GNU Binutils 外部連結 BinutilsObjdump Perl interface to objdump CategoryUnix 程式設計工具 Category 反彙編器