elfバイナリからコンパイラ情報を取得できますか?

elfバイナリからコンパイラ情報を取得できますか?

Linuxでバイナリがどのように構築されるかを理解する機会はありますか? (そして/または他のUNIX)

コンパイラ、バージョン、時間、フラグなど...

探してみましたが、readelfあまり見つかりませんでしたが、バイナリコード/部分などを分析する他の方法があるかもしれません。

抽出する方法を知っていますか?

答え1

すべての場合に適用される一貫したアプローチはありませんが、1つのコンパイラで実行されている操作を検索して情報に基づいて推測できます。

GCCは最も簡単です。.commentGCCバージョン文字列(実行時に取得したものと同じ文字列gcc --version)を含むセクションを作成します。表示する方法があるかどうかはわかりませんが、readelf使用objdump方法は次のとおりです。

objdump -s --section .comment /path/binary

私はあなたの質問の残りの部分を無視したことに気づきました。フラグは通常どこにも保存されません。コメントセクションに表示される可能性が高いですが、この場合は見たことがありません。タイムスタンプの場所はCOFFヘッダーにありますが、ELFにはその場所がないため、コンパイル時間も使用できません。

答え2

どうですか?

readelf -p .comment a.out

答え3

このコマンドを試してみてくださいstrings。これにより、多くのテキスト出力が生成されます。チェックにより、コンパイラを推測できます。

pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3

ここで私はそれにコンパイルされていることを知っていますが、gccいつでもstrings出力をファイルにリダイレクトして確認できます。

という非常に良いユーティリティがありますpeidWindows の場合、Linux では選択肢が見つかりません。

答え4

readelfまたは、objdump両方を行うことができます。

.note.ABI-taggccでコンパイルされたELFファイルにはセクションが追加されます.note.gnu.build-id。どちらも次のように表示できます。

objdump -sj .note.ABI-tag ELFFILE
objdump -sj .note.gnu.build-id ELFFILE

オプション「s」は内容全体を表示することを意味し、「j」は部分名を意味する。このスタイルはセクションの16進コンテンツを取得します。

このコマンドは、readelf -nELFFILEの人が読める内容を一度表示します。オプション 'n' はコメントを意味します。あなたが好きなものを選択してください。

ちなみに、あなたはobjcopyelfファイルに独自のセクションを追加することができます。

関連情報