llvm-objdump - LLVM 的物件檔案傾印器

概要

llvm-objdump [命令] [選項] [檔案名稱…]

描述

llvm-objdump 工具程式會印出命令列上指定的物件檔案和最終連結映像檔的內容。如果沒有指定檔案名稱,llvm-objdump 會嘗試從 a.out 讀取。如果 - 作為檔案名稱使用,llvm-objdump 將會處理標準輸入串流上的檔案。

命令

至少需要下列命令之一,並且某些命令可以與其他命令組合使用

-a, --archive-headers

顯示封存檔標頭中包含的資訊。

-d, --disassemble

反組譯輸入檔案中找到的所有可執行區段。在某些架構(AArch64、PowerPC、x86)上,預設會反組譯所有已知的指令。在其他架構上,需要 --mcpu--mattr 來啟用某些指令集。停用的指令會顯示為 <unknown>

-D, --disassemble-all

反組譯輸入檔案中找到的所有區段。

--disassemble-symbols=<symbol1[,symbol2,...]>

僅反組譯指定的符號。當指定 --demangle 時,會採用還原修飾的符號名稱,否則採用修飾過的符號名稱。暗示 --disassemble

--dwarf=<value>

傾印指定的 DWARF 偵錯區段。支援的值為

frames - .debug_frame

-f, --file-headers

顯示整體檔案標頭的內容。

--fault-map-section

顯示錯誤映射區段的內容。

-h, --headers, --section-headers

顯示每個區段標頭的摘要。

--help

顯示使用資訊並結束。不與其他命令堆疊。

-p, --private-headers

顯示特定格式的檔案標頭。

-r, --reloc

顯示檔案中的重定位條目。

-R, --dynamic-reloc

顯示檔案中的動態重定位條目。

--raw-clang-ast

傾印 clang AST 區段的原始二進位內容。

-s, --full-contents

顯示每個區段的內容。

-t, --syms

顯示符號表。

-T, --dynamic-syms

顯示動態符號表的內容。

-u, --unwind-info

顯示輸入的 unwind 資訊。

此操作目前僅支援 COFF 和 Mach-O 物件檔案。

-v, --version

顯示 llvm-objdump 可執行檔的版本。不與其他命令堆疊。

-x, --all-headers

顯示所有可用的標頭資訊。相當於指定 --archive-headers--file-headers--private-headers--reloc--section-headers--syms

選項

llvm-objdump 支援下列選項

--adjust-vma=<offset>

將反組譯或區段標頭列印中顯示的位址增加指定的偏移量。

--arch-name=<string>

反組譯時指定目標架構。使用 --version 以取得可用目標的清單。

--build-id=<string>

使用給定的建置 ID 查找物件,以十六進位字串指定。找到的物件會被視為輸入檔案名稱處理。

-C, --demangle

在輸出中還原修飾符號名稱。

--debug-file-directory <path>

提供具有 .build-id 子目錄的目錄路徑,以搜尋已剝離二進位檔的偵錯資訊。將依給定的順序搜尋此引數的多個實例。

--debuginfod, --no-debuginfod

是否嘗試使用 debuginfod 查找偵錯二進位檔。除非另有指定,否則僅當編譯了 libcurl (LLVM_ENABLE_CURL) 且環境變數 DEBUGINFOD_URLS 提供了至少一個伺服器 URL 時,才會啟用 debuginfod。

--debug-vars=<format>

在反組譯旁邊印出原始碼層級變數的位置(在暫存器或記憶體中)。format 可以是 unicodeascii,如果省略則預設為 unicode

--debug-vars-indent=<width>

相對於反組譯的開頭,縮排原始碼層級變數顯示的距離。預設為 52 個字元。

-j, --section=<section1[,section2,...]>

僅對指定的區段執行命令。對於 Mach-O,請使用 segment,section 來指定區段名稱。

-l, --line-numbers

反組譯時,顯示原始碼行號。暗示 --disassemble

-M, --disassembler-options=<opt1[,opt2,...]>

傳遞目標特定的反組譯器選項。可用選項

  • reg-names-std:僅限 ARM(預設)。以 ARM 的指令集文件中列印,其中 r13/r14/r15 替換為 sp/lr/pc。

  • reg-names-raw:僅限 ARM。使用 r 後面跟著暫存器編號。

  • no-aliases:僅限 AArch64 和 RISC-V。印出原始指令助憶符號,而不是虛擬指令助憶符號。

  • numeric:僅限 RISC-V。印出原始暫存器名稱,而不是 ABI 助憶符號。(例如,印出 x1 而不是 ra)

  • att:僅限 x86(預設)。以 AT&T 語法印出。

  • intel:僅限 x86。以 Intel 語法印出。

--disassembler-color=<mode>

啟用或停用反組譯器色彩輸出。

  • off:停用反組譯器色彩輸出。

  • on:啟用反組譯器色彩輸出。

  • terminal:如果終端機支援,則啟用反組譯器色彩輸出(預設)。

--mcpu=<cpu-name>

針對反組譯指定特定的 CPU 類型。指定 --mcpu=help 以顯示可用的 CPU。

--mattr=<a1,+a2,-a3,...>

啟用/停用目標特定的屬性。指定 --mattr=help 以顯示可用的屬性。

-mllvm <arg>

指定要轉發到 LLVM CommandLine 程式庫的引數。

--no-leading-addr, --no-addresses

反組譯時,不要印出指令或內嵌重定位的前導位址。

--no-print-imm-hex

在反組譯輸出中,不要對立即值使用十六進位格式。

--no-show-raw-insn

反組譯時,不要印出每個指令的原始位元組。

--offloading

顯示 LLVM offloading 區段的內容。

--prefix=<prefix>

當使用 --source 選項進行反組譯時,將 prefix 前置到絕對路徑。

--prefix-strip=<level>

當使用 --source 選項進行反組譯時,從絕對路徑中剝離 level 個初始目錄。如果沒有 --prefix,此選項無效。

--print-imm-hex

在反組譯輸出中印出立即值時使用十六進位格式(預設)。

-S, --source

反組譯時,顯示與反組譯交錯的原始碼。暗示 --disassemble

--show-all-symbols

在反組譯期間顯示所有符號,即使在相同位置定義了多個符號。

--show-lma

傾印 ELF 區段標頭時,顯示 LMA 欄位。除非任何區段具有不同的 VMA 和 LMA,否則預設為關閉。

--start-address=<address>

反組譯時,僅從指定的位址開始反組譯。

列印重定位時,僅列印從至少 address 的偏移量修補的重定位。

列印符號時,僅列印值至少為 address 的符號。

--stop-address=<address>

反組譯時,僅反組譯到指定的位址但不包含該位址。

列印重定位時,僅列印修補偏移量到 address 的重定位。

列印符號時,僅列印值到 address 的符號。

--symbolize-operands

反組譯時,將分支目標運算元符號化,以印出標籤而不是實際位址。

當印出 PC 相對全域符號參考時,將其印為與前導符號的偏移量。

當 bb-address-map 區段存在時(即,物件檔案是使用 -fbasic-block-address-map 建置的),標籤會從該區段擷取。如果 pgo-analysis-map 與 bb-address-map 一起存在,則任何可用的分析都會在相關的區塊標籤後印出。預設情況下,任何具有特殊表示法的分析(即 BlockFrequency、BranchProbability 等)都會印為原始十六進位值。

僅適用於 PowerPC 物件或 X86 連結映像檔。

範例

非符號化的分支指令,具有本機目標和 PC 相對記憶體存取,例如

cmp eax, dword ptr [rip + 4112]
jge 0x20117e <_start+0x25>

可能會變成

<L0>:
  cmp eax, dword ptr <g>
  jge      <L0>
--pretty-pgo-analysis-map

當搭配 bb-address-map 和 pgo-analysis-map 使用 --symbolize-operands 時,使用與其分析 Pass 相同的格式印出分析。美化格式的範例是印出相對於進入區塊的區塊頻率,與 BFI 相同。

僅當啟用 --symbolize-operands 時才有效。

--triple=<string>

要反組譯的目標三元組,請參閱 --version 以取得可用的目標。

-w, --wide

為了與 GNU objdump 相容而被忽略。

--x86-asm-syntax=<style>

已棄用。當與 --disassemble 一起使用時,選擇從 X86 後端發出的程式碼樣式。支援的值為

att

AT&T 樣式組語

intel

Intel 樣式組語

預設的反組譯樣式為 att

-z, --disassemble-zeroes

反組譯時,不要跳過零區塊。

@<FILE>

從回應檔案 <FILE> 讀取命令列選項和命令。

僅限 MACH-O 選項與命令

--arch=<architecture>

指定要反組譯的架構。請參閱 --version 以取得可用的架構。

--archive-member-offsets

印出 Mach-O 封存檔中每個封存成員的偏移量(需要 --archive-headers)。

--bind

顯示綁定資訊

--data-in-code

顯示程式碼資料表中的資料。

--dis-symname=<name>

僅反組譯指定符號的指令。

--chained-fixups

印出鏈式修復資訊。

--dyld-info

印出 dyld 用於解析最終連結二進位檔中外部參考的綁定和重新定基資訊。

--dylibs-used

顯示連結檔案使用的共享程式庫。

--dsym=<string>

使用 .dSYM 檔案進行偵錯資訊。

--dylib-id

顯示 dylib 檔案的共享程式庫 ID。

--exports-trie

顯示匯出的符號。

--function-starts [=<addrs|names|both>]

印出 Mach-O 物件的函式啟動表。使用 addrs (預設) 僅印出函式的位址,使用 names 僅印出函式的名稱(如果可用),或使用 both 印出位址旁邊的名稱。

-g

如果可用,則從偵錯資訊中印出行資訊。

--full-leading-addr

反組譯時印出完整的前導位址。

--indirect-symbols

顯示間接符號表。

--info-plist

以字串形式顯示 info plist 區段。

--lazy-bind

顯示延遲綁定資訊。

顯示連結器最佳化提示。

-m, --macho

使用 Mach-O 特定物件檔案剖析器。與 --macho 一起使用時,命令和其他選項的行為可能會有所不同。

--no-leading-headers

不要印出任何前導標頭。

--no-symbolic-operands

反組譯時不要印出符號運算元。

--non-verbose

以非詳細或數字形式顯示 Mach-O 物件的資訊。

--objc-meta-data

顯示 Objective-C 執行階段中繼資料。

--private-header

僅顯示第一個特定格式的檔案標頭。

--rebase

顯示重新定基資訊。

--rpaths

顯示二進位檔的執行階段搜尋路徑。

--universal-headers

顯示通用標頭。

--weak-bind

顯示弱綁定資訊。

僅限 XCOFF 選項與命令

--symbol-description

將符號描述新增至反組譯輸出。

--traceback-table

解碼反組譯輸出中的回溯表。暗示 --disassemble

錯誤

若要回報錯誤,請造訪 <https://github.com/llvm/llvm-project/labels/tools:llvm-objdump/>。

另請參閱

llvm-nm(1), llvm-otool(1), llvm-readelf(1), llvm-readobj(1)