2015-10-19 22 views
5

は、Linux上の2つのコマンドです:objcopyとdsymutilの違いは何ですか?

  1. それは、スタンドアロンのデバッグ情報ファイルを作成し、という意味で
    dsymutil <binary> -o <binary>.dSYM 
    

    等価マック

    に下記へ

    objcopy --only-keep-debug foo foo.dbg 
    objcopy --add-gnu-debuglink=foo.dbg foo 
    

    同等。

  2. 実行ファイルとデバッグ情報ファイルの間にリンクを作成します。
    strip -S <binary> 
    
    マック

    に下記へ

    objcopy --strip-debug foo 
    

    OR

    strip -g <binary> 
    

    同等:

    を除去ためのその後

は、Linuxのコマンドであります

答えて

2

objcopyの一部はdsymutilと機能的に同じです。

dSYMにバイナリロケーションを記録するツールはありません。むしろ、dSYM &バイナリは共通のUUIDを共有し、シンボルファイルを検索するクライアントはDebugSymbolsフレームワークを使用します。このフレームワークでは、Spotlightインポータ、検索パス、 "dSYM外部スクリプトの検索"などのさまざまなトリックを使用します。別のデバッグファイル。したがって、--add-gnu-debuglinkと同等のものは必要ありません。

macバージョンのstrip -Sは、binutilsバージョンと同じ方法でデバッグ情報を削除します。違いは、OS Xのstrip -Sは実際にバイナリのサイズを大幅に縮小しないことです。 OS Xでは、デバッグ情報は常に.oファイルまたはdSYMに存在する実行可能ファイルからは除外されます。実行可能ファイルには、lldbまたはdsymutilに.oファイルからdwarfをリンクする方法を伝える小さな「デバッグマップ」しかありません。 strip -Sは、デバッグマップを削除するだけで済みます。

+0

1. dSYMとバイナリ間のMac OSXでのリンクはどのように行われますか? 2. .oファイルもdsymutilに渡す必要があるのでしょうか? –

+0

いいえ、dsymutilはすべての.oファイルの場所を示す実行可能ファイルから "デバッグマップ"を読み取ります。これは、.oファイルを元の場所に配置し、dsymutilを実行するバイナリを削除していないことを意味します。これは、dsymutilを実行するための.oファイルを探す必要がないという利便性のために受け入れられるトレードオフのようです... –

+0

私はちょうど#2に答えたと思います。 #1については。簡単に言えば、バイナリでdsymutilを実行することです。バイナリは.oファイルが(デバッグマップから)どこにあるかを知っているので、バイナリへのパスをdsymutilにするだけで、それ以外はすべて実行します。 dsymutilの動作の詳細については、Xcode 7.0で内部バージョンのdsymutilからllvmソースベースに実装されたバージョンに切り替えました。ですから、llvm/tools/dsymutilのソースを読んで、完全なストーリーを得ることができます。 –

関連する問題