llvm-objcopy - オブジェクトコピーおよび編集ツール

概要

llvm-objcopy [オプション] 入力 [出力]

説明

llvm-objcopy は、オブジェクトをコピーおよび操作するためのツールです。基本的な使用方法では、入力のセマンティックコピーを出力に作成します。オプションを指定すると、セクションの削除など、出力は途中で変更される場合があります。

出力ファイルが指定されていない場合、入力ファイルはインプレースで変更されます。「-」を入力ファイルに指定すると、入力はプログラムの標準入力ストリームから読み取られます。「-」を出力ファイルに指定すると、出力はプログラムの標準出力ストリームに書き込まれます。

入力がアーカイブの場合、要求された操作は各アーカイブメンバーに個別に適用されます。

このツールはまだ開発中ですが、ほとんどのシナリオでは、GNUのobjcopyのドロップイン置換として機能します。

汎用およびクロスプラットフォームオプション

次のオプションは、ファイル形式に依存しないか、複数のファイル形式に適用されます。

<debug-file> の .gnu_debuglink セクションを出力に追加します。

--add-section <section=file>

<file> の内容を持つ <section> という名前のセクションを出力に追加します。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を使用します。デフォルトでオンになっています。

--help, -h

コマンドラインオプションの概要を表示します。

--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> で説明されているように、出力のシンボルの名前を変更します。ファイルでは、各行は名前変更する1つのシンボルを表し、古い名前と新しい名前が空白で区切られています。先頭と末尾の空白は無視されます。「#」の後に続くものはすべて無視されます。複数のファイルから名前を読み取るには、複数回指定できます。

--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> の出力のセクションプロパティを設定します。複数のセクションを更新するには、複数回指定できます。

サポートされているフラグ名は、`alloc`、`load`、`noload`、`readonly`、`exclude`、`debug`、`code`、`data`、`rom`、`share`、`contents`、`merge`、`strings`、および`large`です。すべてのフラグがすべてのオブジェクトファイル形式またはターゲットアーキテクチャで意味を持つわけではありません。

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 = load フラグが指定されていない限り、IMAGE_SCN_CNT_UNINITIALIZED_DATAIMAGE_SCN_MEM_READ フラグを追加します。

  • 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 フラグを追加します。

--strip-all-gnu

出力からすべてのシンボル、デバッグセクション、リロケーションを削除します。このオプションは、GNU objcopy--strip-all スイッチと同等です。

--strip-all, -S

ELF オブジェクトの場合、セグメント内にないすべてのシンボルと非割り当てセクションを、.gnu.warning、.ARM.attribute セクション、およびセクション名テーブルを除いて出力から削除します。

COFF および Mach-O オブジェクトの場合、出力からすべてのシンボル、デバッグセクション、およびリロケーションを削除します。

--strip-debug, -g

出力からすべてのデバッグセクションを削除します。

--strip-symbol <symbol>, -N

<symbol> という名前のすべてのシンボルを出力から削除します。複数のシンボルを削除するために複数回指定できます。

--strip-symbols <filename>

ファイル <filename> に記載されている名前を持つすべてのシンボルを出力から削除します。ファイルでは、各行は1つのシンボル名を表し、先頭と末尾の空白は無視され、'#' の後のものはすべて無視されます。複数のファイルから名前を読み取るために複数回指定できます。

--strip-unneeded-symbol <symbol>

<symbol> という名前のローカルまたは未定義のシンボルで、リロケーションで必要とされないものをすべて出力から削除します。

--strip-unneeded-symbols <filename>

ファイル <filename> に記載されている名前を持つすべてのシンボルを、ローカルまたは未定義で、リロケーションで必要とされない場合、出力から削除します。ファイルでは、各行は1つのシンボル名を表し、先頭と末尾の空白は無視され、'#' の後のものはすべて無視されます。複数のファイルから名前を読み取るために複数回指定できます。

--strip-unneeded

リロケーションで必要とされないローカルまたは未定義のシンボルをすべて削除します。また、すべてのデバッグセクションも削除します。

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

セクション <name> の内容をファイル <file> の内容で置き換えます。セクション <name> がセグメントの一部である場合、新しい内容は既存のセクションよりも大きくすることはできません。

--version, -V

llvm-objcopy 実行ファイルのバージョンを表示します。

--wildcard, -w

シンボル関連のフラグでワイルドカード構文を許可します。セクション関連のフラグではデフォルトで有効です。–regex とは互換性がありません。

ワイルドカード構文では、次の特殊記号が使用できます。

文字

意味

等価

*

任意の数の文字

.*

?

任意の1文字

.

\

次の文字をエスケープ

\

[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 フィールドはすべて 0 に設定されます。

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

サイズがゼロでないセグメントのLMAを<val>だけシフトします。

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

<section> パターンに一致するセクションのアドレスを指定された値に変更するか、現在の値に +<val>/-<val> を適用します。複数のパターンを指定するために複数回指定できます。各セクションは、1つの --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を指定すると解凍されます。1つのセクションが複数のオプションで指定された場合、最後に指定されたオプションが優先されます。‘!’で始まるワイルドカード<section>は許可されません。セグメント内のセクションは(解)圧縮できません。

--decompress-debug-sections

出力内の圧縮されたDWARFデバッグセクションをすべて解凍します。

--discard-locals, -X

“.L”で始まるローカルシンボルを出力から削除します。

--extract-dwo

DWARF .dwoセクション以外のすべてのセクションを出力から削除します。

--extract-main-partition

出力からメインパーティションを抽出します。

--extract-partition <name>

出力から指定された名前のパーティションを抽出します。

--gap-fill <value>

バイナリ出力の場合、セクション間のギャップを0ではなく<value>で埋めます。値は符号なし8ビット整数である必要があります。

--globalize-symbol <symbol>

<symbol>という名前の定義済みのシンボルを出力内でグローバルシンボルとしてマークします。複数のシンボルをマークするには、複数回指定できます。

--globalize-symbols <filename>

<filename>のファイルから名前のリストを読み込み、それらの名前を持つ定義済みのシンボルを出力内でグローバルとしてマークします。ファイルでは、各行が1つのシンボルを表し、先頭と末尾の空白は無視され、'#'の後のものはすべて無視されます。複数のファイルから名前を読み取るには、複数回指定できます。

--input-target <format>, -I

入力を指定された形式で読み込みます。有効な<format>値のリストについては、「サポートされている形式」を参照してください。指定されていない場合、llvm-objcopyは自動的に形式を判別しようとします。

--keep-file-symbols

それ以外の場合は削除されるSTT_FILEタイプのシンボルを保持します。

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

<symbol>という名前のシンボルを除いて、出力内のすべてのシンボルをローカルとしてマークします。複数のシンボルを無視するには、複数回指定できます。

--keep-global-symbols <filename>

<filename>というファイルに名前が記載されているシンボルを除いて、出力内のすべてのシンボルをローカルとしてマークします。ファイルでは、各行が1つのシンボルを表し、先頭と末尾の空白は無視され、'#'の後のものはすべて無視されます。複数のファイルから名前を読み取るには、複数回指定できます。

--keep-section <section>

出力からセクションを削除する場合、<section>という名前のセクションは削除しません。複数のセクションを保持するには、複数回指定できます。

--keep-symbol <symbol>, -K

出力からシンボルを削除する場合、<symbol>という名前のシンボルは削除しません。複数のシンボルを保持するには、複数回指定できます。

--keep-symbols <filename>

出力からシンボルを削除する場合、<filename>というファイルに名前が記載されているシンボルは削除しません。ファイルでは、各行が1つのシンボルを表し、先頭と末尾の空白は無視され、'#'の後のものはすべて無視されます。複数のファイルから名前を読み取るには、複数回指定できます。

--localize-hidden

出力内で、非表示または内部可視性のすべてのシンボルをローカルとしてマークします。

--localize-symbol <symbol>, -L

<symbol>という名前の定義済みの非共通シンボルを出力内でローカルシンボルとしてマークします。複数のシンボルをローカルとしてマークするには、複数回指定できます。

--localize-symbols <filename>

<filename>のファイルから名前のリストを読み込み、それらの名前を持つ定義済みの非共通シンボルを出力内でローカルとしてマークします。ファイルでは、各行が1つのシンボルを表し、先頭と末尾の空白は無視され、'#'の後のものはすべて無視されます。複数のファイルから名前を読み取るには、複数回指定できます。

--new-symbol-visibility <visibility>

バイナリ入力または--add-symbolを使用する場合に自動的に作成されるシンボルの可視性を指定します。有効なオプションは次のとおりです。

  • default

  • hidden

  • internal

  • protected

デフォルトはdefaultです。

--no-verify-note-sections

ノートセクションを追加する場合、セクション形式が有効かどうかは検証しません。

--output-target <format>, -O

出力を指定された形式で書き込みます。有効な<format>値のリストについては、「サポートされている形式」を参照してください。指定されていない場合、出力形式は--input-targetで指定された値、またはそのオプションも指定されていない場合は入力ファイルの形式と同じと見なされます。

--pad-to <address>

バイナリ出力の場合、出力をロードアドレス<address>まで、0または--gap-fillで指定された値を使用して埋め込みます。

--prefix-alloc-sections <prefix>

出力の割り当て可能なセクション名の先頭に<prefix>を追加します。

--prefix-symbols <prefix>

出力のすべてのシンボル名の先頭に<prefix>を追加します。

--preserve-dates, -p

出力ファイルへのアクセス時間と更新時間を保持します。

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

出力において、<old>という名前のセクションを<new>に名前変更し、指定された<flag>値を適用します。--set-section-flagsを参照して、サポートされているフラグの一覧を確認してください。複数のセクションの名前を変更するために複数回指定できます。

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

<section>セクションのタイプを整数<type>に設定します。複数のセクションを更新するために複数回指定できます。

--set-start <addr>

出力の開始アドレスを<addr>に設定します。以前に指定された--change-startまたは--adjust-startオプションを無効にします。

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

シンボルの可視性を指定された値に変更します。

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

<filename>からシンボルのリストを読み込み、それらの可視性を指定された値に変更します。可視性の値:default、internal、hidden、protected。

--skip-symbol <symbol>

シンボルの名前、バインディング、または可視性を変更できる他のオプションを実行するときに、<symbol>シンボルのパラメータを変更しません。

--skip-symbols <filename>

シンボルの名前、バインディング、または可視性を変更できる他のオプションを実行するときに、ファイル<filename>に名前が記載されているシンボルのパラメータを変更しません。ファイルでは、各行が1つのシンボルを表し、先頭と末尾の空白は無視され、「#」の後のものはすべて無視されます。複数のファイルから名前を読み込むために複数回指定できます。

--split-dwo <dwo-file>

--extract-dwo<dwo-file>を出力ファイルとして、他のオプションを指定せずにllvm-objcopyを実行し、その後、入力ファイルに対して--strip-dwoを実行することと同等です。

--strip-dwo

出力からすべてのDWARF .dwoセクションを削除します。

--strip-non-alloc

セグメント内にないすべての非割り当て可能なセクションを出力から削除します。

--strip-sections

セグメント内にないすべてのセクションヘッダーとセクションデータを出力から削除します。多くのツールは、セクションヘッダーのないオブジェクトを使用できません。

--target <format>, -F

指定されたフォーマットに対して--input-target--output-targetと同等です。サポートされているフォーマットを参照して、有効な<format>値の一覧を確認してください。

--verify-note-sections

ノートセクションを追加する際に、セクションフォーマットが有効かどうかを確認します。デフォルトで有効です。

--weaken-symbol <symbol>, -W

<symbol>という名前のグローバルシンボルを出力において弱いシンボルとしてマークします。複数のシンボルを弱くマークするために複数回指定できます。

--weaken-symbols <filename>

ファイル<filename>から名前のリストを読み込み、それらの名前を持つグローバルシンボルを出力において弱いシンボルとしてマークします。ファイルでは、各行が1つのシンボルを表し、先頭と末尾の空白は無視され、「#」の後のものはすべて無視されます。複数のファイルから名前を読み込むために複数回指定できます。

--weaken

定義済みのすべてのグローバルシンボルを出力において弱いシンボルとしてマークします。

MACH-O固有のオプション

--keep-undefined

未定義のシンボルを、それらが削除される場合でも保持します。

COFF固有のオプション

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

PEサブシステム、およびオプションでサブシステムバージョンを設定します。

サポートされているフォーマット

llvm-objcopyは、--input-target--output-target、および--targetオプションに対して、現在以下の値をサポートしています。GNU objcopyとの互換性のため、これらの値はすべてbfd名です。

  • 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

--output-target のみに対して、以下のフォーマットがllvm-objcopyでサポートされています。

  • srec

さらに、binaryihex、およびsrecを除くすべてのターゲットに、-freebsdをサフィックスとして追加できます。

バイナリ入出力

--input-targetの値としてbinaryが使用された場合、入力ファイルはELF再配置可能オブジェクトのデータセクションに埋め込まれ、_binary_<file_name>_start_binary_<file_name>_end_binary_<file_name>_sizeというシンボルが、データの開始、終了、サイズを表します。<file_name>はコマンドラインで指定された入力ファイルのパスで、英数字以外の文字は_に変換されます。

--output-targetの値としてbinaryが使用された場合、出力ファイルは生のバイナリファイルになり、入力ファイルのメモリイメージが含まれます。シンボルと再配置情報は破棄されます。イメージは、出力ファイルの最初のロード可能なセクションのアドレスから始まります。

終了ステータス

llvm-objcopyは、エラーが発生した場合、ゼロ以外の終了コードで終了します。それ以外の場合は、コード0で終了します。

バグ

バグの報告は、<https://github.com/llvm/llvm-project/labels/tools:llvm-objcopy/strip/>をご覧ください。

--input-target--targetには既知の問題があり、binaryihex形式のみが有効になります。他の値は無視され、llvm-objcopyは入力形式を推測しようとします。

関連情報

llvm-strip(1)