ELF バイナリが共有オブジェクトであるか、位置に依存しない実行可能ファイルであるかをすばやく確認する方法を探しています。含まれているシンボル/関数をチェックすることでそれができると思います。完全なファイルを読み取る必要がない、より効率的な方法を探しています。少なくとも Android、Linux (32 および 64 ビット) など、さまざまなプラットフォームでチェックを実行する必要があります。
2 に答える
ELF バイナリが共有オブジェクトであるか、位置に依存しない実行可能ファイルであるかをすばやく確認する方法を探しています。
チェックする方法はありません。PIE 実行可能ファイルは共有オブジェクトです。
含まれているシンボル/関数をチェックすることでそれができると思います。
シンボルは取り除くことができますが、一度取り除くとわかりません。
共有オブジェクトと実行可能ファイルは通常、リンクされたスタートアップ コードによって異なります
その通りです。通常、PIE は にリンクされてScrt1.o
いますが、共有ライブラリは通常リンクされていません。しかし、共有ライブラリがリンクされることを妨げるものは何もありませんScrt1.o
。ストリップされたバイナリでは、起動コードが多少問題になる可能性があることさえわかります。
共有ライブラリと自分で作成した PIE 実行可能ファイルを区別することが本当に必要な場合(共有ライブラリとPIE の一般的なケースを解決するのではなく)、 PT_INTERP
( )の存在を確認するのreadelf -l a.out | grep INTERP
がおそらく最も簡単な方法です。 : PIE 実行可能ファイルにPT_INTERP
はlibc.so.6
.
elfutilsと含まれているプログラムeh-readelfを試してください:
eh-readelf --file-header $ELFFILE
ファイル ヘッダーとそのファイルの種類を表示します。
...
Typ: EXEC (Executable file)
...
また
Typ: DYN (Shared object file)
小さなsed
ラインと組み合わせると、あなたが望む結果が得られるはずです.