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

显示输入的展开信息。

此操作目前仅支持 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 卸载节的内容。

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

当与 bb-address-map 和 pgo-analysis-map 一起使用 --symbolize-operands 时,使用与其分析传递相同的格式打印分析。漂亮格式的一个示例是打印相对于入口块的块频率,与 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)