3. objcopy
URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=binutils-ja&node=objcopy"
"binutils/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]
[`--strip-unneeded-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]
[`--strip-unneeded-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
は,完全にリンクされているファイルを,二 つの書式間でコピー可能であるべきだということに注意してください.しかし, 再配置可能なオブジェクトファイルを二つのフォーマットの間でコピーするこ とは,期待したようには動作しません.
objcopy
は,その変換を行うために一時ファイルを作成し,その後で それを削除します.objcopy
は,そのすべての変換作業でBFDを 使用します.それは,BFDで記述されているすべてのフォーマットにアク セスするので,明示的に伝えること無く,ほとんどのフォーマットを認識する ことが可能です.See 節 `BFD' in
Using LD
.
objcopy
は,`srec'出力ターゲットを使用することで, S-recordを生成するために使用することが可能です(例えば,`-O srec'を使用してください).
objcopy
は,`binary'の出力ターゲットを使用することで,生 のバイナリファイルを生成するために使用することが可能です(例えば, `-O binary'を使用してください).objcopy
が生のバイナリ ファイルを生成するとき,それは本質的に,入力オブジェクトファイルの内容 のメモリダンプを生成します.すべてのシンボルと再配置の情報は削除されま す.メモリダンプは,出力ファイルにコピーされる最抵位のセクションのロー ドアドレスから開始します.
S-recordや生のバイナリファイルを生成するとき,デバッグ情報を含むセクショ ンを削除するため,`-S'を使用すると便利かもしれません.場合によっ ては,バイナリファイルに必要のない情報を含むセクションを削除するため, `-R'が役に立つでしょう.
注意---objcopy
は,入力ファイルのエンディアンを変更することが できません.入力フォーマットにエンディアンがある場合,(持たないフォーマッ トもあります),objcopy
は,入力ファイルを同じエンディアンを持 つ,またはエンディアンを持たないフォーマットのファイル(例えば `srec')だけにコピーすることが可能です.
infile
outfile
-
それぞれ入力と出力のファイルです.outfileを指定しない場合,
objcopy
は結果的に破壊される一時ファイルを作成し, infileに名前を変更します.
-I bfdname
--input-target=bfdname
-
ソースファイルのオブジェクトのフォーマットを,それを導き出すのではなく, bfdnameと考えます.詳細は,See 節 15.1 ターゲットの選択.
-O bfdname
--output-target=bfdname
-
出力ファイルを,オブジェクトファイルのフォーマットbfdnameを用いて 書き出します.詳細は,See 節 15.1 ターゲットの選択.
-F bfdname
--target=bfdname
-
入出力両方のファイルに対し,オブジェクトのフォーマットとして bfdnameを使用します.すなわち,単純に元ファイルからコピー先のファ イルに,変換せずにデータを転送します.詳細は,See 節 15.1 ターゲットの選択.
-B bfdarch
--binary-architecture=bfdarch
-
生の入力ファイルをオブジェクトファイルに変換するとき役に立ちます.この 状況では,出力先のアーキテクチャはbfdarchに設定されるはずです.入 力ファイルに既知のbfdarchがある場合,このオプションは無視されます. 変換処理で作成される特殊なシンボルを参照することで,このバイナリデータ をプログラム内部でアクセスすることが可能です.これらのシンボルは, `_binary_objfile_start',`_binary_objfile_end', そして`_binary_objfile_size'という名前です.例えば,画像ファ イルをオブジェクトファイルに変換した後,これらのシンボルを使用してコー ド内でアクセスすることが可能です.
-j sectionname
--only-section=sectionname
-
指名されたセクションのみ,入力ファイルから出力ファイルへコピーします. このオプションは,一回以上与えてもかまいません.このオプションを不適切 に使用すると,出力ファイルが使用不可能になることに注意してください.
-R sectionname
--remove-section=sectionname
-
指名されている,あらゆるsectionnameセクションを出力ファイルから削 除します.このオプションは,一回以上与えてもかまいません.このオプショ ンを不適切に使用すると,出力ファイルが使用不可能になることに注意してく ださい.
-S
--strip-all
-
再配置の情報ととシンボルの情報を,ソースファイルからコピーしません.
-g
--strip-debug
-
デバッグのシンボルやセクションをソースファイルからコピーしません.
--strip-unneeded
-
再配置の処理に不要な,すべてのシンボルを削除します.
-K symbolname
--keep-symbol=symbolname
-
ソースファイルからシンボルsymbolnameのみコピーします.このオプショ ンは,一回以上与えてもかまいません.
-N symbolname
--strip-symbol=symbolname
-
ソースファイルからシンボルsymbolnameをコピーしません.このオプショ ンは,一回以上与えてもかまいません.
--strip-unneeded-symbol=symbolname
-
再配置で必要でない限り,シンボルsymbolnameを,ソースファイルから コピーしません.このオプションは,一回以上与えてもかまいません.
-G symbolname
--keep-global-symbol=symbolname
-
グローバルなsymbolnameシンボルのみ保持します.すべての他のシンボ ルをそれらが外部から見えないようにファイルローカルにします.このオプショ ンは一回以上与えてもかまいません.
-L symbolname
--localize-symbol=symbolname
-
外部から見えないようにするため,シンボルsymbolnameをファイルでロー カルにします.このオプションは,一回以上与えてもかまいません.
-W symbolname
--weaken-symbol=symbolname
-
シンボルsymbolnameをweakにします.このオプションは,一回以上与え てもかまいません.
-w
--wildcard
-
コマンドラインオプションで使用するため,symbolnameでの正規表現を 許可します.疑問符(?),アスタリスク(*),バックスラッシュ(\),そして角括 弧([])オペレータを,シンボル名の任意の場所に使用することが可能です.シ ンボル名の最初の文字が感嘆符(!)の場合,シンボルに対するスイッチの意味を 反対にします.例えば,以下を考えます.
これで,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バイトごとに一つだけコピーします.`-b'や `--byte'オプションを用いてそのバイトを選択してください.デフォル トは4です.
objcopy
は,`-b'や`--byte'を指定して いない場合,このオプションを無視します.
-p
--preserve-dates
-
出力ファイルのアクセスと編集の日付を入力ファイルと同じに設定します.
--debugging
-
可能な場合,デバッグ情報を変換します.特定のデバッグフォーマットのみサ ポートされていて,そして,変換処理は時間がかかるため,これはデフォルト ではありません.
--gap-fill val
-
valを用いてセクション間のギャップを補充します.このオプションはセ クションのload address (LMA)に適用されます.それは,lower addressでセクションの大きさを増加し,そして,valを用いて作成され る余分な空間で補充することで動作します.
--pad-to address
-
出力ファイルをload address addressまでパディングします.これは, 最後のセクションの大きさを増加することで動作します.余分な空間は, `--gap-fill'で指定された値(デフォルトはゼロ)で補充されます.
--set-start val
-
新しいファイルの開始アドレスをvalに設定します.すべてのオブジェク トファイルのフォーマットが,開始アドレスの設定をサポートするわけではあ りません.
--change-start incr
--adjust-start incr
-
開始アドレスをincrを加えることで変更します.すべてのオブジェクト ファイルのフォーマットが,開始アドレスの設定をサポートするわけではあり ません.
--change-addresses incr
--adjust-vma incr
-
開始アドレスのように,incrを加えることで,VMAとLMAアドレスを変更 します.オブジェクトファイルのフォーマットによっては,セクションアドレ スを任意に変更できないものもあります.これはセクションを再配置しないこ とに注意してください.セクションが特定のアドレスにロードされていること をプログラムが期待し,セクションが異なるアドレスにロードされるように変 更するために,このオプションが使用された場合,プログラムは失敗するかも しれません.
--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'や`--change-section-lma'や `--change-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 -B \
--rename-section .data=.rodata,alloc,load,readonly,data,contents \
|
--change-leading-char
-
オブジェクトファイルのフォーマットには,シンボルの開始時に特別な文字を 使用するものもあります.そのような文字で最もよくあるのはアンダースコア で,それはコンパイラがすべてのシンボルの前によく追加するものです.この オプションは,
objcopy
に,オブジェクトファイルのフォーマットを 変換している間にすべてのシンボルに前置される文字を変更するよう伝えます. オブジェクトファイルのフォーマットが同じ前置文字を使用している場合,こ のオプションは効果がありません.それ以外の場合,それは適切に,文字を加 えたり,文字を削除したり,文字を変更したりします.
--remove-leading-char
-
グローバルシンボルの最初の文字が,オブジェクトファイルのフォーマットで 使用されているシンボルに前置される特殊な文字の場合,その文字を削除しま す.そのような文字で最もよくあるのはアンダースコアです.このオプション は,すべてのグローバルシンボルから前置されるアンダースコアを削除します. シンボル名に対して異なる規則を持つ,異なるファイルフォーマットのオブジェ クト同士をリンクしたい場合,これは役に立つはずです.これは `--change-leading-char'とは異なり,出力ファイルのオブジェクトファ イルのフォーマットに依存せず,それは適切なときは常にシンボル名を変更し ます.
--srec-len=ival
-
srec出力でのみ意味があります.生成されているSrecordの最大長を ivalに設定します.この長さは,両方のアドレス,データ,そしてcrc フィールドをカバーします.
--srec-forceS3
-
srec出力でのみ意味があります.S1/S2レコードの生成を避け,S3のみのレコー ドのフォーマットを作成します.
--redefine-sym old=new
-
シンボル名をoldからnewに変更します.ソースを持っていない二 つのものを一緒にリンクしようとし,名前の衝突があるとき便利です.
--redefine-syms=filename
-
ファイルfilenameにリストアップされているそれぞれのシンボル対 "old new"に,`--redefine-sym'を適用します. filenameは単純なフラットファイルで,一行ごとに一つのシンボルの組 を書きます.行コメントはハッシュ文字(#)で始めることが可能です.このオプ ションは,一回以上与えてもかまいません.
--weaken
-
ファイルのすべてのグローバルシンボルをweakにします.リンカに対し `-R'オプションを使用している他のオブジェクトに対してリンクするオ ブジェクトを構築するとき,これは便利です.このオプションは,weakなシン ボルをサポートしているオブジェクトファイルを使用しているときだけ効果が あります.
--keep-symbols=filename
-
`--keep-symbol'オプションを,ファイルfilenameにリストアッ プされているそれぞれのシンボルに適用します.filenameは単なるフラッ トなファイルで,一行に一つのシンボル名があります.行のコメントはハッシュ 文字(#)で始めることが可能です.このオプションは一回以上与えてもかまいま せん.
--strip-symbols=filename
-
`--strip-symbol'オプションを,ファイルfilenameにリストアッ プされているそれぞれのシンボルに適用します.filenameは単なるフラッ トなファイルで,一行に一つのシンボル名があります.行のコメントはハッシュ 文字(#)で始めることが可能です.このオプションは一回以上与えてもかまいま せん.
--strip-unneeded-symbols=filename
-
ファイルfilenameにリストアップされているそれぞれのシンボルに,に `--strip-unneeded-symbol'を適用します.filenameは単純なフ ラットファイルで,一行ごとに一つのシンボルを書きます.行コメントはハッ シュ文字(#)で始めることが可能です.このオプションは一回以上与えてもかま いません.
--keep-global-symbols=filename
-
`--keep-global-symbol'オプションを,ファイルfilenameにリス トアップされているそれぞれのシンボルに適用します.filenameは単な るフラットなファイルで,一行に一つのシンボル名があります.行のコメント はハッシュ文字(#)で始めることが可能です.このオプションは一回以上与えて もかまいません.
--localize-symbols=filename
-
`--localize-symbol'オプションを,ファイルfilenameにリスト アップされているそれぞれのシンボルに適用します.filenameは単なる フラットなファイルで,一行に一つのシンボル名があります.行のコメントは ハッシュ文字(#)で始めることが可能です.このオプションは一回以上与えても かまいません.
--weaken-symbols=filename
-
`--weaken-symbol'オプションを,ファイルfilenameにリストアッ プされているそれぞれのシンボルに適用します.filenameは単なるフラッ トなファイルで,一行に一つのシンボル名があります.行のコメントはハッシュ 文字(#)で始めることが可能です.このオプションは一回以上与えてもかまいま せん.
--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'でstripされるセクションを削除し,デバッグセクショ ンを残しながら,ファイルをstripします.
このオプションの目的は,二つの部分の実行形式を作成するために `--add-gnu-debuglink'を組み合わせで使用します.一つは,RAMと配布 物にスペースが無い場合のstripされたバイナリで,二番目のデバッグ情報ファ イルは,デバッグ能力が要求される場合だけ必要になります.これらのファイ ルを作成するための推奨手順は以下の通りです.
- 通常の実行形式のリンク.
foo
と仮定します.
- デバッグ情報を含んでいるファイルを作成するために
objcopy --only-keep-debug foo foo.dbg
の実行.
- stripされた実行形式を作成するために
objcopy --strip-debug foo
の実 行.
- stripされた実行形式にデバッグ情報を追加リンクするために
objcopy --add-gnu-debuglink=foo.dbg foo
を実行.
注意 - デバッグ情報ファイルに対する拡張として,.dbg
の選択は任意 です.また,--only-keep-debug
の段階はオプションです.代わりに以 下のようにすることも可能です.
- 通常の実行形式のリンク.
-
foo
をfoo.full
へコピー.
-
strip --strip-debug foo
の実行.
-
objcopy --add-gnu-debuglink=foo.full foo
の実行.
つまり,`--add-gnu-debuglink'で示されるファイルは,完全な実行形 式です.`--only-keep-debug'スイッチファイルを生成する必要はあり ません.
-V
--version
-
objcopy
のバージョンナンバーを表示します.
-v
--verbose
-
冗長な出力です.修正されたすべてのオブジェクトファイルをリストアップし ます.アーカイブの場合,`objcopy -v'は,アーカイブのすべてのメンバー をリストアップします.
--help
-
objcopy
へのオプションの概要を表示します.
--info
- すべてのアーキテクチャと利用可能なオブジェクトのフォーマットを示すリス トを表示します.