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 info。

此操作目前僅支援 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 查找物件,建置 ID 以十六進制字串指定。找到的物件會被視為輸入檔名。

-C, --demangle

在輸出中對符號名稱進行demangle處理。

--debug-file-directory <path>

提供包含 .build-id 子目錄的路徑,以搜尋已移除除錯資訊的二進制檔案的除錯資訊。會按照指定的順序搜尋此參數的多個執行個體。

--debuginfod, --no-debuginfod

是否嘗試對偵錯二進位檔案進行 debuginfod 查找。除非有指定,只有在編譯 libcurl 時 (LLVM_ENABLE_CURL) 且環境變數 DEBUGINFOD_URLS 提供至少一個伺服器網址的情況下,才會啟用 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 卸載區段的內容。

--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=<位址>

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

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

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

--stop-address=<位址>

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

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

列印符號時,僅列印值最大為 位址 的符號。

--symbolize-operands

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

列印與 PC 相關的全局符號參考時,將其列印為從前導符號開始的偏移量。

當存在 bb-address-map 區段時(即,使用 -fbasic-block-sections=labels 建置目標文件),將從該區段而不是其他區段檢索標籤。如果 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

--symbolize-operands 與 bb-address-map 和 pgo-analysis-map 一起使用時,使用與其分析遍歷相同的格式列印分析。漂亮格式的一個例子是以與 BFI 相同的方式列印相對於入口區塊的區塊頻率。

僅在啟用 --symbolize-operands 時有效。

--triple=<字串>

要反組譯的目標三元組,有關可用目標,請參見 --version

-w, --wide

為了與 GNU objdump 相容,已忽略。

--x86-asm-syntax=<樣式>

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

att

AT&T 風格組譯

intel

Intel 風格組譯

預設的組譯樣式為 att

-z, --disassemble-zeroes

組譯時不要跳過零區塊。

@<FILE>

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

僅限 MACH-O 的選項和命令

--arch=<架構>

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

--archive-member-offsets

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

--bind

顯示繫結資訊

--data-in-code

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

--dis-symname=<名稱>

僅組譯指定符號的指令。

--chained-fixups

列印鏈式修正資訊。

--dyld-info

列印 dyld 用於解析最終連結二進制檔案中外部參考的繫結和重定址資訊。

--dylibs-used

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

--dsym=<字串>

使用 .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

以字串形式顯示資訊屬性列表區段。

--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)