llvm-objcopy - 对象复制和编辑工具

概要

llvm-objcopy [选项] 输入 [输出]

描述

llvm-objcopy 是一个用于复制和操作对象的工具。在基本用法中,它创建一个从输入到输出的语义副本。如果指定了任何选项,则输出可能会在此过程中被修改,例如通过删除 sections(节)。

如果未指定输出文件,则会就地修改输入文件。如果为输入文件指定了 “-”,则从程序的标准输入流读取输入。如果为输出文件指定了 “-”,则将输出写入程序的标准输出流。

如果输入是归档文件,则任何请求的操作都将单独应用于每个归档成员。

该工具仍在积极开发中,但在大多数情况下,它可以作为 GNU objcopy 的直接替代品。

通用和跨平台选项

以下选项与文件格式无关,或适用于多种文件格式。

为输出添加一个用于 <debug-file> 的 .gnu_debuglink 节。

--add-section <section=file>

向输出添加一个名为 <section> 的节,其内容来自 <file>。对于 ELF 对象,如果名称以 “.note” 开头,则该节的类型将为 SHT_NOTE。否则,它将具有 SHT_PROGBITS 类型。可以多次指定以添加多个节。

对于 MachO 对象,<section> 必须格式化为 <segment name>,<section name>

--binary-architecture <arch>, -B

为了兼容性而被忽略。

--disable-deterministic-archives, -U

在更新归档成员标头时,使用真实的 UID、GID 和时间戳值。

--discard-all, -x

从输出中删除大多数本地符号。不同的文件格式可能会将此限制为本地符号的子集。例如,ELF 对象中的文件和节符号将不会被丢弃。此外,还会删除所有调试节。

--dump-section <section>=<file>

将节 <section> 的内容转储到文件 <file> 中。可以多次指定以将多个节转储到不同的文件中。<file> 与提供给 llvm-objcopy 的输入和输出文件无关,因此正常的复制和编辑操作仍将执行。在转储节之前,不会对节执行任何操作。

对于 MachO 对象,<section> 必须格式化为 <segment name>,<section name>

--enable-deterministic-archives, -D

复制归档文件时启用确定性模式,即对归档成员标头 UID、GID 和时间戳字段使用 0。默认情况下启用。

--globalize-symbol <symbol>

将任何名为 <symbol> 的已定义符号标记为输出中的全局符号。可以多次指定以标记多个符号。

--globalize-symbols <filename>

从文件 <filename> 中读取名称列表,并将具有这些名称的已定义符号标记为输出中的全局符号。在文件中,每行代表一个符号,忽略前导和尾随空格,以及 ‘#’ 之后的所有内容。可以多次指定以从多个文件中读取名称。

--help, -h

打印命令行选项的摘要。

--keep-global-symbol <symbol>, -G

将输出中的所有符号标记为本地符号,但名称为 <symbol> 的符号除外。可以多次指定以忽略多个符号。

--keep-global-symbols <filename>

将输出中的所有符号标记为本地符号,但文件 <filename> 中命名的符号除外。在文件中,每行代表一个符号,忽略前导和尾随空格,以及 ‘#’ 之后的所有内容。可以多次指定以从多个文件中读取名称。

--localize-symbol <symbol>, -L

将任何名为 <symbol> 的已定义非公共符号标记为输出中的本地符号。可以多次指定以将多个符号标记为本地符号。

--localize-symbols <filename>

从文件 <filename> 中读取名称列表,并将具有这些名称的已定义非公共符号标记为输出中的本地符号。在文件中,每行代表一个符号,忽略前导和尾随空格,以及 ‘#’ 之后的所有内容。可以多次指定以从多个文件中读取名称。

--only-keep-debug

生成一个调试文件作为输出,该文件仅保留对调试目的有用的节的内容。

对于 ELF 对象,这将删除 SHF_ALLOC 节的内容(非 SHT_NOTE),方法是将它们设为 SHT_NOBITS 并尽可能缩小程序头。

--only-section <section>, -j

从输出中删除所有节,但名为 <section> 的节除外。可以多次指定以保留多个节。

对于 MachO 对象,<section> 必须格式化为 <segment name>,<section name>

--redefine-sym <old>=<new>

将输出中名为 <old> 的符号重命名为 <new>。可以多次指定以重命名多个符号。

--redefine-syms <filename>

按照文件 <filename> 中的描述重命名输出中的符号。在文件中,每行代表一个要重命名的符号,旧名称和新名称之间用空格分隔。忽略前导和尾随空格,以及 ‘#’ 之后的所有内容。可以多次指定以从多个文件中读取名称。

--regex

如果指定,其他开关指定的符号和节名称将被视为扩展 POSIX 正则表达式模式。

--remove-symbol-prefix <prefix>

从每个符号名称的开头删除 <prefix>。对于不以 <prefix> 开头的符号,不执行任何操作。

--remove-section <section>, -R

从输出中删除指定的节。可以多次指定以同时删除多个节。

对于 MachO 对象,<section> 必须格式化为 <segment name>,<section name>

--set-section-alignment <section>=<align>

将节 <section> 的对齐方式设置为 <align>。可以多次指定以更新多个节。

--set-section-flags <section>=<flag>[,<flag>,...]

根据指定的 <flag> 值设置输出中节 <section> 的节属性。可以多次指定以更新多个节。

支持的标志名称为 allocloadnoloadreadonlyexcludedebugcodedataromsharecontentsmergestringslarge。并非所有标志都对所有对象文件格式或目标架构都有意义。

对于 ELF 对象,标志具有以下效果

  • alloc = 添加 SHF_ALLOC 标志。

  • load = 如果节具有 SHT_NOBITS 类型,则将其标记为 SHT_PROGBITS 节。

  • readonly = 如果未指定此标志,则添加 SHF_WRITE 标志。

  • exclude = 添加 SHF_EXCLUDE 标志。

  • code = 添加 SHF_EXECINSTR 标志。

  • merge = 添加 SHF_MERGE 标志。

  • strings = 添加 SHF_STRINGS 标志。

  • contents = 如果节具有 SHT_NOBITS 类型,则将其标记为 SHT_PROGBITS 节。

  • large = 在 x86_64 上添加 SHF_X86_64_LARGE;如果目标架构不是 x86_64,则拒绝。

对于 COFF 对象,标志具有以下效果

  • alloc = 添加 IMAGE_SCN_CNT_UNINITIALIZED_DATAIMAGE_SCN_MEM_READ 标志,除非指定了 load 标志。

  • noload = 添加 IMAGE_SCN_LNK_REMOVEIMAGE_SCN_MEM_READ 标志。

  • readonly = 如果未指定此标志,则添加 IMAGE_SCN_MEM_WRITE 标志。

  • exclude = 添加 IMAGE_SCN_LNK_REMOVEIMAGE_SCN_MEM_READ 标志。

  • debug = 添加 IMAGE_SCN_CNT_INITIALIZED_DATAIMAGE_SCN_MEM_DISCARDABLEIMAGE_SCN_MEM_READ 标志。

  • code = 添加 IMAGE_SCN_CNT_CODEIMAGE_SCN_MEM_EXECUTEIMAGE_SCN_MEM_READ 标志。

  • data = 添加 IMAGE_SCN_CNT_INITIALIZED_DATAIMAGE_SCN_MEM_READ 标志。

  • share = 添加 IMAGE_SCN_MEM_SHAREDIMAGE_SCN_MEM_READ 标志。

--skip-symbol <symbol>

在执行其他可以更改符号名称、绑定或可见性的选项时,不要更改符号 <symbol> 的参数。

--skip-symbols <filename>

在执行其他可以更改符号名称、绑定或可见性的选项时,不要更改文件 <filename> 中命名的符号的参数。在文件中,每行代表一个符号,忽略前导和尾随空格,以及 ‘#’ 之后的所有内容。可以多次指定以从多个文件中读取名称。

--strip-all-gnu

从输出中删除所有符号、调试节和重定位。此选项等效于 GNU objcopy--strip-all 开关。

--strip-all, -S

对于 ELF 对象,从输出中删除所有符号和不在段内的非 alloc 节,但 .gnu.warning、.ARM.attribute 节和节名称表除外。

对于 COFF 和 Mach-O 对象,从输出中删除所有符号、调试节和重定位。

--strip-debug, -g

从输出中删除所有调试节。

--strip-symbol <symbol>, -N

从输出中删除所有名为 <symbol> 的符号。可以多次指定以删除多个符号。

--strip-symbols <filename>

从输出中删除所有名称出现在文件 <filename> 中的符号。在文件中,每行代表一个符号名称,忽略前导和尾随空格,以及 ‘#’ 之后的所有内容。可以多次指定以从多个文件中读取名称。

--strip-unneeded-symbol <symbol>

从输出中删除所有名为 <symbol> 的本地或未定义符号,且这些符号不是任何重定位所必需的。

--strip-unneeded-symbols <filename>

从输出中删除所有名称出现在文件 <filename> 中的符号,如果它们是本地或未定义的,并且不是任何重定位所必需的。在文件中,每行代表一个符号名称,忽略前导和尾随空格,以及 ‘#’ 之后的所有内容。可以多次指定以从多个文件中读取名称。

--strip-unneeded

从输出中删除所有本地或未定义符号,这些符号不是重定位所必需的。还会删除所有调试节。

--update-section <name>=<file>

将节 <name> 的内容替换为来自文件 <file> 的内容。如果节 <name> 是段的一部分,则新内容不能大于现有节。

--version, -V

显示 llvm-objcopy 可执行文件的版本。

--wildcard, -w

允许符号相关标志使用通配符语法。节相关标志默认启用。与 –regex 不兼容。

通配符语法允许以下特殊符号

字符

含义

等效于

*

*

.*

?

?

.

\

\

\

[a-z]

字符类

[a-z]

[!a-z], [^a-z]

否定字符类

[^a-z]

此外,以 ‘!’ 开头的通配符将阻止匹配,即使另一个标志匹配也是如此。例如 -w -N '*' -N '!x' 将剥离除 x 之外的所有符号。

通配符的顺序无关紧要。例如,-w -N '*' -N '!x'-w -N '!x' -N '*' 相同。

@<FILE>

从响应文件 <FILE> 读取命令行选项和命令。

ELF 特定选项

以下选项仅针对 ELF 对象实现。如果与其他对象一起使用,llvm-objcopy 将发出错误或静默忽略它们。

--add-symbol <name>=[<section>:]<value>[,<flags>]

向输出符号表添加一个名为 <name> 的新符号,位于名为 <section> 的节中,值为 <value>。如果未指定 <section>,则将符号添加为绝对符号。<flags> 影响符号属性。接受的值为

  • global = 符号将具有全局绑定。

  • local = 符号将具有本地绑定。

  • weak = 符号将具有弱绑定。

  • default = 符号将具有默认可见性。

  • hidden = 符号将具有隐藏可见性。

  • protected = 符号将具有受保护的可见性。

  • file = 符号将是 STT_FILE 符号。

  • section = 符号将是 STT_SECTION 符号。

  • object = 符号将是 STT_OBJECT 符号。

  • function = 符号将是 STT_FUNC 符号。

  • indirect-function = 符号将是 STT_GNU_IFUNC 符号。

此外,以下标志被接受但被忽略:debugconstructorwarningindirectsyntheticunique-objectbefore

可以多次指定以添加多个符号。

允许 llvm-objcopy 删除节,即使这会留下无效的节引用。任何无效的 sh_link 字段都将被设置为零。

--change-section-lma \*{+-}<val>

将非零大小段的 LMA 移动 <val>

--change-section-address <section>{=+-}<val>, --adjust-section-vma

将与 <section> 模式匹配的节的地址更改为指定值,或将 +<val>/-<val> 应用于当前值。可以多次指定以指定多个模式。每个节仅被一个 --change-section-address 参数修改。如果节名称与多个模式匹配,则应用最右边的更改。对象文件需要是 ET_REL 类型。

--change-start <incr>, --adjust-start

<incr> 添加到程序的起始地址。可以多次指定,在这种情况下,这些值将累积应用。

--compress-debug-sections [<format>]

使用指定的格式压缩输出中的 DWARF 调试节。支持的格式为 zlibzstd。如果省略 <format>,则使用 zlib

--compress-sections <section>=<format>

使用指定的格式压缩或解压缩与 <section> 匹配的节。支持的格式为 zlibzstd。指定 none 进行解压缩。当一个节与多个选项匹配时,最后一个选项生效。不允许以 ‘!’ 开头的通配符 <section>。段内的节无法(解)压缩。

--decompress-debug-sections

解压缩输出中任何压缩的 DWARF 调试节。

--discard-locals, -X

从输出中删除以 “.L” 开头的本地符号。

--extract-dwo

从输出中删除所有不是 DWARF .dwo 节的节。

--extract-main-partition

从输出中提取主分区。

--extract-partition <name>

从输出中提取名为 partition(分区)。

--gap-fill <value>

对于二进制输出,用 <value> 而不是零填充节之间的间隙。该值必须是无符号 8 位整数。

--input-target <format>, -I

以指定的格式读取输入。有关有效 <format> 值的列表,请参见 支持的格式。如果未指定,llvm-objcopy 将尝试自动确定格式。

--keep-file-symbols

保留 STT_FILE 类型的符号,即使它们原本会被剥离。

--keep-section <section>

从输出中删除节时,不要删除名为 <section> 的节。可以多次指定以保留多个节。

--keep-symbol <symbol>, -K

从输出中删除符号时,不要删除名为 <symbol> 的符号。可以多次指定以保留多个符号。

--keep-symbols <filename>

从输出中删除符号时,不要删除文件 <filename> 中命名的符号。在文件中,每行代表一个符号,忽略前导和尾随空格,以及 ‘#’ 之后的所有内容。可以多次指定以从多个文件中读取名称。

--localize-hidden

将输出中所有具有隐藏或内部可见性的符号标记为本地符号。

--new-symbol-visibility <visibility>

指定使用二进制输入或 --add-symbol 自动创建的符号的可见性。有效选项包括

  • default (默认)

  • hidden (隐藏)

  • internal (内部)

  • protected (保护)

默认值为 default

--no-verify-note-sections

添加 note section 时,不验证 section 格式是否有效。

--output-target <format>, -O

将输出写入为指定的格式。有关有效 <format> 值的列表,请参阅 支持的格式。如果未指定,则假定输出格式与为 --input-target 指定的值相同,如果该选项也未指定,则与输入文件的格式相同。

--pad-to <address>

对于二进制输出,使用零值或 --gap-fill 指定的值将输出填充到加载地址 <address>

--prefix-alloc-sections <prefix>

<prefix> 添加到输出中所有可分配 section 名称的前面。

--prefix-symbols <prefix>

<prefix> 添加到输出中每个符号名称的前面。

--preserve-dates, -p

在输出中保留访问和修改时间戳。

--remove-note [<name>/]<type>

从不在段中的 SHT_NOTE section 中删除整数类型为 <type> 且名称为 <name> 的 note。可以多次指定。

--rename-section <old>=<new>[,<flag>,...]

在输出中将名为 <old> 的 section 重命名为 <new>,并应用任何指定的 <flag> 值。有关支持的标志列表,请参阅 --set-section-flags。可以多次指定以重命名多个 section。

--set-section-type <section>=<type>

将 section <section> 的类型设置为整数 <type>。可以多次指定以更新多个 section。

--set-start <addr>

将输出的起始地址设置为 <addr>。覆盖任何先前指定的 --change-start--adjust-start 选项。

--set-symbol-visibility <symbol>=<visibility>

将符号的可见性更改为指定值。

--set-symbols-visibility <filename>=<visibility>

从 <filename> 读取符号列表,并将它们的可见性更改为指定值。可见性值:default, internal, hidden, protected。

--split-dwo <dwo-file>

等效于运行 llvm-objcopy 并使用 --extract-dwo<dwo-file> 作为输出文件,并且没有其他选项;然后对输入文件使用 --strip-dwo

--strip-dwo

从输出中删除所有 DWARF .dwo section。

--strip-non-alloc

从输出中删除所有不在段内的非可分配 section。

--strip-sections

从输出中删除所有 section header 和所有不在段内的 section 数据。请注意,许多工具将无法使用没有 section header 的对象。

--target <format>, -F

等效于为指定格式同时设置 --input-target--output-target。有关有效 <format> 值的列表,请参阅 支持的格式

--verify-note-sections

添加 note section 时,验证 section 格式是否有效。默认启用。

--weaken-symbol <symbol>, -W

将名为 <symbol> 的全局符号标记为输出中的弱符号。可以多次指定以将多个符号标记为弱符号。

--weaken-symbols <filename>

从文件 <filename> 中读取名称列表,并将具有这些名称的全局符号标记为输出中的弱符号。在该文件中,每行代表一个符号,忽略前导和尾随空格,以及 ‘#’ 之后的所有内容。可以多次指定以从多个文件读取名称。

--weaken

将所有已定义的全局符号标记为输出中的弱符号。

MACH-O 专属选项

--keep-undefined

保留未定义的符号,即使它们本来会被剥离。

COFF 专属选项

--subsystem <name>[:<version>]

设置 PE 子系统,以及可选的子系统版本。

支持的格式

以下值当前受 llvm-objcopy--input-target--output-target--target 选项支持。为了与 GNU objcopy 兼容,这些值都是 bfdnames。

  • binary (二进制)

  • ihex

  • elf32-i386

  • elf32-x86-64

  • elf64-x86-64

  • elf32-iamcu

  • elf32-littlearm

  • elf64-aarch64

  • elf64-littleaarch64

  • elf32-littleriscv

  • elf64-littleriscv

  • elf32-powerpc

  • elf32-powerpcle

  • elf64-powerpc

  • elf64-powerpcle

  • elf32-bigmips

  • elf32-ntradbigmips

  • elf32-ntradlittlemips

  • elf32-tradbigmips

  • elf32-tradlittlemips

  • elf64-tradbigmips

  • elf64-tradlittlemips

  • elf32-sparc

  • elf32-sparcel

  • elf32-hexagon

  • elf32-loongarch

  • elf64-loongarch

  • elf64-s390

以下格式仅受 llvm-objcopy--output-target 支持

  • srec

此外,除了 binaryihexsrec 之外的所有目标都可以使用 -freebsd 作为后缀。

二进制输入和输出

如果将 binary 用作 --input-target 的值,则输入文件将作为数据 section 嵌入到 ELF 可重定位对象中,符号 _binary_<file_name>_start_binary_<file_name>_end_binary_<file_name>_size 表示数据的开始、结束和大小,其中 <file_name> 是命令行上指定的输入文件的路径,非字母数字字符转换为 _

如果将 binary 用作 --output-target 的值,则输出文件将是一个原始二进制文件,其中包含输入文件的内存映像。符号和重定位信息将被丢弃。映像将从输出中第一个可加载 section 的地址开始。

退出状态

如果出现错误,llvm-objcopy 将以非零退出代码退出。否则,它将以代码 0 退出。

错误

要报告错误,请访问 <https://github.com/llvm/llvm-project/labels/tools:llvm-objcopy/strip/>。

关于 --input-target--target 存在已知问题,导致只有 binaryihex 格式才有效。其他值将被忽略,并且 llvm-objcopy 将尝试猜测输入格式。

参见

llvm-strip(1)