OBJCOPY(1)

名称
objcopy - オブジェクトファイルのコピーと変換

書式
objcopy [-F bfdname|--target=bfdname]
        [-I bfdname|--input-target=bfdname]
        [-O bfdname|--output-target=bfdname]
        [-B bfdarch|--binary-architecture=bfdarch]
        [-S|--strip-all]
        [-g|--strip-debug]
        [-K symbolname|--keep-symbol=symbolname]
        [-N symbolname|--strip-symbol=symbolname]
        [-G symbolname|--keep-global-symbol=symbolname]
        [-L symbolname|--localize-symbol=symbolname]
        [-W symbolname|--weaken-symbol=symbolname]
        [-w|--wildcard]
        [-x|--discard-all]
        [-X|--discard-locals]
        [-b byte|--byte=byte]
        [-i interleave|--interleave=interleave]
        [-j sectionname|--only-section=sectionname]
        [-R sectionname|--remove-section=sectionname]
        [-p|--preserve-dates]
        [--debugging]
        [--gap-fill=val]
        [--pad-to=address]
        [--set-start=val]
        [--adjust-start=incr]
        [--change-addresses=incr]
        [--change-section-address section{=,+,-}val]
        [--change-section-lma section{=,+,-}val]
        [--change-section-vma section{=,+,-}val]
        [--change-warnings] [--no-change-warnings]
        [--set-section-flags section=flags]
        [--add-section sectionname=filename]
        [--rename-section oldname=newname[,flags]]
        [--change-leading-char] [--remove-leading-char]
        [--srec-len=ival] [--srec-forceS3]
        [--redefine-sym old=new]
        [--redefine-syms=filename]
        [--weaken]
        [--keep-symbols=filename]
        [--strip-symbols=filename]
        [--keep-global-symbols=filename]
        [--localize-symbols=filename]
        [--weaken-symbols=filename]
        [--alt-machine-code=index]
        [--prefix-symbols=string]
        [--prefix-sections=string]
        [--prefix-alloc-sections=string]
        [--add-gnu-debuglink=path-to-file]
        [--only-keep-debug]
        [--writable-text]
        [--readonly-text]
        [--pure]
        [--impure]
        [-v|--verbose]
        [-V|--version]
        [--help] [--info]
        infile [outfile]

解説
GNU objcopy ユーティリティはあるオブジェクトファイルの内容を他へコピーします。 objcopy はオブジェクトファイルの読み書きに GNU BFD ライブラリを使います。 元のオブジェクトファイルと異なるフォーマットでコピー先の オブジェクトファイルに書き込む事が可能です。 objcopy の厳密な挙動はコマンドラインの引数で制御します。 objcopy は、完全にリンクされたファイルなら、 任意の 2 形式間でコピー可能であるはずですが、 再配置可能オジェクトファイルの任意の 2 形式間でのコピーは、 期待通りに動作しないかもしれません。

objcopy は変換のために一時ファイルを作成して後でそれらを削除します。 objcopy はすべての変換作業で BFD を使います; つまり BFD が知っている フォーマットはすべて知っている事になるので、明示的に指定しなくても 大部分のフォーマットを認識する事が出来ます。

objcopy で出力先に srec を指定する (例えば -O srec を使う) ことで S レコードを生成できます。

objcopy で出力先に binary を指定する (例えば -O binary を使う) ことで生のバイナリファイルを生成できます。 objcopy で生のバイナリファイルを生成することは、本質的には入力の オブジェクトファイルの内容のメモリダンプを生成することに なるでしょう。 シンボルと再配置情報はすべて捨て去られます。 メモリダンプは出力ファイルに コピーされる中で最も低位のセクションの仮想アドレスから始まります。

S レコードや生のバイナリファイルを生成する場合は、 -S を使ってデバッグ情報を含むセクションを削除するのが良いかもしれません。 場合によっては -R が、バイナリファイルに必要無い情報を含むセクションを削除するのに有用でしょう。

注 - objcopy は入力ファイルのエンディアンを変えられません。 入力ファイルにエンディアン性がある場合 (フォーマットによっては エンディアン性がないものがあります)、 同じエンディアン性のファイルフォーマットか エンディアン性の無いファイル書式 (例: srec) へのみ、 objcopy はコピー可能となります。

オプション

infile
outfile
    それぞれ入力と出力ファイルです。 outfile を指定しないと、 objcopy は一時ファイルを作成してから そのファイル名を infile に付けかえて しまいます。

-I bfdname
--input-target=bfdname
    入力ファイルのオブジェクト形式を推測しようとするかわりに bfdname であるとして扱います。

-O bfdname
--output-target=bfdname
    オブジェクト形式として bfdname を使って出力ファイルに書き込みます。

-F bfdname
--target=bfdname
    入出力両方のオブジェクト形式が bfdname であるとします; つまり、入力から出力へ無変換でデータを 単純に転送するということです。

-B bfdarch
--binary-architecture=bfdarch
    生のバイナリ入力ファイルをオブジェクトファイルへ変換する場合に有用です。 この場合、出力アーキテクチャを bfdarch に設定可能です。 入力ファイルが既知の bfdarch を持つ場合、このオプションは無視されます。 このバイナリデータは、変換処理によって作成された特殊シンボルを介し、 プログラムからアクセス可能となります。 これらのシンボルは、 _binary_objfile_start, _binary_objfile_end, _binary_objfile_size という名前です。 例えば、画像ファイルをオブジェクトファイルに変換し、 コードからこれらのシンボルを使用することでアクセス可能となります。

-j sectionname
--only-section=sectionname
    指定したセクションのみ入力ファイルから出力ファイルへコピーし、 他のすべてのセクションを捨てます。 このオプションは 2 回以上指定できます。 このオプションを不適切に使うと出力ファイルが 利用できない物になるので注意して下さい。

-R sectionname
--remove-section=sectionname
    sectionname で 指定されたセクションをファイルから取り除きます。 このオプションは 2 回以上指定できます。 このオプションを不適切に使うと出力ファイルが 利用できない物になるので注意して下さい。

-S
--strip-all
    再配置とシンボルの情報を入力ファイルからコピーしません。

-g
--strip-debug
    デバッグシンボル、デバッグセクションを入力ファイルからコピーしません。

--strip-unneeded
    再配置処理に不要なシンボルをすべて取り除きます。

-K symbolname
--keep-symbol=symbolname
    入力ファイルからシンボル symbolname だけをコピーします。 このオプションは 2 回以上指定できます。

-N symbolname
--strip-symbol=symbolname
    入力ファイルからシンボル symbolname をコピーしません。 このオプションは 2 回以上指定できます。

-G symbolname
--keep-global-symbol=symbolname
    シンボル symbolname のみをグローバルにします。 他のシンボルはすべて、外部から参照できないようにファイル内ローカルにします。 このオプションは 2 回以上指定できます。

-L symbolname
--localize-symbol=symbolname
    シンボル symbolname を、外部から参照できないようにファイル内 ローカルにします。このオプションは 2 回以上指定できます。

-W symbolname
--weaken-symbol=symbolname
    シンボル symbolname を weak にします。 このオプションは 2 回以上指定できます。

-w
--wildcard
    他のコマンド行オプションの中で使用される symbolname で、 正規表現の使用を許可します。 疑問符 (?)、アスタリスク (*)、バックスラッシュ (\)、角括弧 ([]) 演算子をシンボル名の中のどこででも使用可能にします。 シンボル名の最初の文字が感嘆符 (!) である場合、そのスイッチの意味が そのシンボルに対しては逆になります。 例えば、

              -w -W !foo -W fo*

    により、objcopy は ``foo'' を除き、``fo'' で始まるすべてのシンボルを weak にします。

-x
--discard-all
    入力ファイルからグローバルでないシンボルをコピーしません。

-X
--discard-locals
    コンパイラが生成したローカルシンボルをコピーしません (それらは通常 L か . で始まります)。

-b byte
--byte=byte
    入力ファイルの各 byte 番めのバイトのみを取り出します (ヘッダデータには影響しません)。 byte には 0 から interleave-1 の範囲の値を指定できます。 interleave は、-i または --interleave のオプションで 指定するか、デフォルトの 4 です。 このオプションは ROM に書き込むためのファイルを作成するために有用です。 典型的には "srec" の出力指定と共に使います。

-i interleave
--interleave=interleave
    各 interleave バイトごとに 1 バイトだけをコピーします。 どれをコピーするかは -b か --byte オプションで 選びます。デフォルトは 4です。 -b か --byte のどちらも指定されていない場合、 objcopy は本オプションを無視します。

-p
--preserve-dates
    出力ファイルのアクセス時刻と更新時刻を入力ファイルに合わせます。

--debugging
    可能であればデバッグ情報を変換します。 特定のデバッグ情報しかサポートしておらず、変換処理は時間を 要する可能性があるので、これはデフォルトではありません。

--gap-fill val
    セクション間のすきまを val で埋めます。 この操作はセクションの load address (LMA) に適用されます。 低位アドレスのセクションのサイズを増やし、できた余分の空間を val で 埋める事で実現しています。

--pad-to address
    ロードアドレス address まで出力ファイルに詰め物をします。 これは最後のセクションのサイズを増やす事で行われます。 できた余分の空間は --gap-fill で 指定された値 (デフォルトは 0) で埋められます。

--set-start val
    新しいファイルの開始アドレスを val に設定します。 すべてのオブジェクトファイル形式が開始アドレスの設定をサポートしている わけではありません。

--change-start incr
--adjust-start incr
    開始アドレスを、incr を加算する事で変更します。 すべてのオブジェクトファイル形式が開始アドレスの設定をサポートしている わけではありません。

--change-addresses incr
--adjust-vma incr
    開始アドレスおよびすべてのセクションの VMA および LMA のアドレスを、incr を 加算する事で変更します。 いくつかのオブジェクトファイル形式では セクションのアドレスを任意の値に変更する事は許されていません。 これはセクションを再配置するのではない事に注意して下さい; もしプログラムがセクションが特定のアドレスにロードされる事を 期待しており、そしてこのオプションがセクションを異なるアドレスに ロードするように使われた場合は、プログラムは正常に 動作しないかもしれません。

--change-section-address section{=,+,-}val
--adjust-section-vma section{=,+,-}val
    指定された section の VMA および LMA アドレスを、 設定または変更します。 = が 指定された場合は、セクションのアドレスは val に設定されます。 そうでなければ val がセクションのアドレスに加算または減算されます。 上の --change-addresses に書かれているコメントも参照して下さい。 入力ファイルに section が存在しない場合は、 --no-change-warnings が指定されていなければ警告が出力されます。

--change-section-lma section{=,+,-}val
    指定された section の LMA アドレスを、 設定または変更します。 LMA アドレスは、 プログラムロード時にセクションがロードされるメモリのアドレスです。 これは通常、プログラム実行時のセクションのアドレスである VMA アドレスと同じですが、システムによっては、 特に ROM にプログラムが保持されるものにおいては、両者は異なります。 = が 指定された場合は、セクションのアドレスは val に設定されます。 そうでなければ val がセクションのアドレスに加算または減算されます。 上の --change-addresses に書かれているコメントも参照して下さい。 入力ファイルに section が存在しない場合は、 --no-change-warnings が指定されていなければ警告が出力されます。

--change-section-vma section{=,+,-}val
    指定された section の VMA アドレスを、 設定または変更します。 VMA アドレスは、 プログラムが実行開始した後にセクションが置かれるアドレスです。 これは通常、メモリにロードされるセクションのアドレスである LMA アドレスと同じですが、システムによっては、 特に ROM にプログラムが保持されるものにおいては、両者は異なります。 = が 指定された場合は、セクションのアドレスは val に設定されます。 そうでなければ val がセクションのアドレスに加算または減算されます。 上の --change-addresses に書かれているコメントも参照して下さい。 入力ファイルに section が存在しない場合は、 --no-change-warnings が指定されていなければ警告が出力されます。

--change-warnings
--adjust-warnings
    --change-section-address, --change-section-lma, --change-section-vma のいずれかが指定された場合、 指定されたセクションが存在しないと警告が出力されます。 これはデフォルトです。

--no-change-warnings
--no-adjust-warnings
    --change-section-address, --adjust-section-lma, --adjust-section-vma のいずれかが指定された場合、 指定された セクションが存在しなくても警告を出力しません。

--set-section-flags section=flags
    指定されたセクションのフラグを設定します。 引数 flags はフラグ名をコンマで区切った文字列です。 認識するフラグ名は alloc, contents, load, noload, readonly, code, data, rom, share, debug です。 内容を持たないセクションに対して contents フラグを設定可能ですが、 内容を持たないセクションに対して contents フラグをクリアする ことは無意味です。 単にそのセクションを削除してください。 すべてのフラグがすべてのオブジェクトファイル形式で 意味を持つとは限りません。

--add-section sectionname=filename
    sectionname で指定された名前の新しいセクションをファイルの コピー中に付け加えます。 新しいセクションの内容はファイル filename から取り込まれます。 セクションのサイズはファイルのサイズになります。 このオプションは任意の名前を持つセクションを サポートできるファイル形式でのみ機能します。

--rename-section oldname=newname[,flags]
    セクションの名前を oldname から newname へ変えます。 この処理において、セクションフラグを flags に変えることもできます。 リンカスクリプトを使ってリネームすることに対する利点は、 出力がオブジェクトファイルのままであり、 リンク済実行形式とはならないことです。

    このオプションが特に有用なのは、入力フォーマットがバイナリの時です。 なぜなら、本オプションは .data セクションを常に作成するからです。 例えば、バイナリデータを含む .rodata セクションを代りに作成したい場合、 次のコマンドラインで実現可能です:

              objcopy -I binary -O <output_format> -B <architecture> \
               --rename-section .data=.rodata,alloc,load,readonly,data,contents \
               <input_binary_file> <output_object_file>

--change-leading-char
    いくつかのオブジェクトファイル形式でシンボルの最初に特殊文字が 使われています。 もっとも一般的なのはアンダスコアで、しばしば コンパイラが各シンボルの前に付け加えます。 このオプションは objcopy に、オブジェクトファイル形式を変換する時に各シンボルの始まりの 文字を変更するよう指示します。 変換前後のオブジェクトファイル形式がシンボルの始まりに同じ文字を 使っている場合は、このオプションは何もしません。 そうでなければ、 このオプションで文字を付け加える、または文字を削除する、または 文字を変更する事が、適切に行われます。

--remove-leading-char
    グローバルシンボルの最初の文字が、オブジェクトファイル形式で使われる シンボルの最初に付加される特殊文字だった場合は、その文字を取り除きます。 シンボルに前置される最も一般的な文字はアンダスコアです。 このオプションは前置されているアンダスコアをすべての グローバルシンボルから取り除きます。 これはシンボル名の取り決めが 異なるファイル形式のファイルを一緒にリンクしたい場合に有用です。 これは --change-leading-char とは異なります。 なぜならこのオプションでは適切であれば、 出力のオブジェクトファイル形式とは関係なく 常にシンボル名を変更してしまうからです。

--srec-len=ival
    srec 出力でのみ意味があります。 S レコードの長さを val に設定します。 この長さには、アドレス、データ、CRC フィールドも含まれます。

--srec-forceS3
    srec 出力でのみ意味があります。 S1/S2 レコードの生成を防ぎ、S3 レコードのみのフォーマットにします。

--redefine-sym old=new
    シンボルの名前を old から new へ変更します。 ソースが無い 2 つのものリンクしようとしていて、 名前の衝突があるときに有用でしょう。

--redefine-syms=filename
    ファイル filename にリストされたシンボルの組 "old new" のそれぞれに対し、--redefine-sym を適用します。 filename は単なるフラットファイルであり、シンボルの組 1 つにつき 1 行を占めます。 ハッシュ文字によりコメント行を置くことができます。 このオプションは複数回指定することができます。

--weaken
    ファイルのすべてのグローバルシンボルを weak に変更します。 これは、-R オプションをリンカに使用して、 他のオブジェクトとリンクするオブジェクトを作成するときに有用です。 このオプションは、オブジェクトファイルフォーマットが weak シンボルをサポートするときのみ効果があります。

--keep-symbols=filename
    ファイル filename で列挙されている各シンボルに対し、 --keep-symbol オプションを適用します。 filename は単に平坦なファイルであり、1 行に 1 シンボルが記述されます。 行コメントは、ハッシュ文字で開始します。 このオプションは 2 回以上指定できます。

--strip-symbols=filename
    ファイル filename で列挙されている各シンボルに対し、 --strip-symbol オプションを適用します。 filename は単に平坦なファイルであり、1 行に 1 シンボルが記述されます。 行コメントは、ハッシュ文字で開始します。 このオプションは 2 回以上指定できます。

--keep-global-symbols=filename
    ファイル filename で列挙されている各シンボルに対し、 --keep-global-symbol オプションを適用します。 filename は単に平坦なファイルであり、1 行に 1 シンボルが記述されます。 行コメントは、ハッシュ文字で開始します。 このオプションは 2 回以上指定できます。

--localize-symbols=filename
    ファイル filename で列挙されている各シンボルに対し、 --localize-symbol オプションを適用します。 filename は単に平坦なファイルであり、1 行に 1 シンボルが記述されます。 行コメントは、ハッシュ文字で開始します。 このオプションは 2 回以上指定できます。

--weaken-symbols=filename
    ファイル filename で列挙されている各シンボルに対し、 --weaken-symbol オプションを適用します。 filename は単に平坦なファイルであり、1 行に 1 シンボルが記述されます。 行コメントは、ハッシュ文字で開始します。 このオプションは 2 回以上指定できます。

--alt-machine-code=index
    出力アーキテクチャが別のマシンコードを持つ場合、 デフォルトのコードの代りに index 番目のコードを使用します。 あるマシンに公式なコードが割り当てられており、 ツールチェーンが新規コードを採用するが、 他のアプリケーションは元のコードが使われることに依存している場合、 有用となります。

--writable-text
    出力ファイルに書き込み可能の印を付けます。 このオプションはすべてのファイル形式に対して意味があるわけでは ありません。

--readonly-text
    出力ファイルに書き込み禁止の印を付けます。 このオプションはすべてのファイル形式に対して意味があるわけでは ありません。

--pure
    出力ファイルにデマンドページの印を付けます。 このオプションはすべてのファイル形式に対して意味があるわけでは ありません。

--impure
    出力ファイルに impure の印を付けます。 このオプションはすべてのファイル形式に対して意味があるわけでは ありません。

--prefix-symbols=string
    出力ファイルのシンボルすべてに string を前置します。

--prefix-sections=string
    出力ファイルのセクションすべてに string を前置します。

--prefix-alloc-sections=string
    出力ファイル中の割り当てられたセクションすべての名前すべてに string を前置します。

--add-gnu-debuglink=path-to-file
    path-to-file への参照を含む .gnu_debuglink セクションを 生成し、出力ファイルに追加します。

--only-keep-debug
    ファイルをストリップします。 すなわち、--strip-debug により除去される任意のセクションを削除し、デバッグ用 セクションを残します。

    この意図は、このオプションと --add-gnu-debuglink とを 組み合わせて使用し、2 パートの実行可能ファイルを生成することに あります。 1 番目はストリップされたバイナリで、RAM と 配布ファイルにおいてより少ない空間を占めるようになり、 2 番目はデバッグ情報ファイルで、デバッグ機能が要求される場合にのみ 必要となるものです。 これらのファイルの生成のための推奨手順は次のようになります。

    1.<実行可能形式を普通どおりにリンクする。ここでは、その名前を>
        "foo" とする...

    1.<"objcopy --only-keep-debug foo foo.dbg" を実行し>
        デバッグ情報を含むファイルを生成する。

    1.<"objcopy --strip-debug foo" を実行し>
        ストリップされた実行可能形式を生成する。

    1.<"objcopy --add-gnu-debuglink=foo.dbg foo"を実行し>
        デバッグ情報へのリンクをストリップ済の実行可能形式に付加する。

    注意: デバッグ情報ファイルのための拡張子の ".dbg" は、任意のものを選択できます。 また、"--only-keep-debug" のステップをやるか やらないかも選択次第です。代わりに次のように行なうこともできます。

    1.<実行可能形式を普通どおりリンクする>
    1.<"foo" を "foo.full" にコピーする>
    1.<"objcopy --strip-debug foo"を実行する>
    1.<"objcopy --add-gnu-debuglink=foo.full foo" を実行する>

    すなわち、 --add-gnu-debuglink が指すファイルは 完全な情報を持つ実行可能形式でも構いません。 --only-keep-debug スイッチを使い生成したファイルでなくても構いません。

-V
--version
    objcopy のバージョン番号を表示して終了します。

-v
--verbose
    出力を冗長にします: 変更されたすべてのオブジェクトファイルをリストします。 アーカイブの場合は "objcopy -V" でアーカイブのメンバがすべて リストされます。

--help
    objcopy のオプションのサマリを表示して終了します。

--info
    利用可能なアーキテクチャとオブジェクト形式すべてのリストを表示します。

関連項目
ld(1), objdump(1), Info の binutils の項。

COPYRIGHT
Copyright (c) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

日本語訳
野首 寛高(hnokubi@yyy.or.jp): FreeBSD 用に翻訳