私はELFとPE形式のオブジェクトファイル(学校/研究プロジェクトの一種)を分析することをプログラムに取り組んでいます。今、私は実行可能ファイルで動的インポートシンボルを処理しようとしています。私はできるだけ多くのシンボルについての情報を探したいと思っています。 PE形式で名
は、輸入は.idata
部に記憶されています。さまざまな情報を持つテーブルがいくつかありますが、興味深いのは、シンボルが定義されているライブラリを調べることに問題はないということです。共有ライブラリの名前とそれからインポートされたシンボルの名前/序数は常にあります。
私もELFファイルにこの種の情報を見つけるしたいと思います。すべてのインポート/エクスポートは.dynsym
セクション(ダイナミックシンボルテーブル)にあります。インポートされたシンボルは、未定義とマークされます。
00000000 DF *UND* 00000000 GLIBC_2.0 fileno
しかし、このシンボルのソースファイルは何もありません。すべての必要な共有ライブラリには、例えば、.dynamic
のセクションに記載されています:シンボル内のライブラリに関する
Dynamic Section:
NEEDED libz.so.1
情報のみが、バージョン文字列= GLIBC_2.0
です。私はこれを通じて本物のライブラリ名を取得する方法について考えていたが、私はobjdump -p
の出力を見たとき、私はGLIBC_2.0
が複数のライブラリーを用いて接続することができることを発見した:
Version References:
required from libm.so.6:
0x0d696910 0x00 13 GLIBC_2.0
required from libgcc_s.so.1:
0x0b792650 0x00 12 GLIBC_2.0
私が正しくELFの動的リンクプロセスを理解していれば
、この情報をELF実行可能ファイルで見つけることはできません。どこからインポートされたシンボルは、すべてのシンボルテーブルをメモリにロードした後、リンカによって決定されます。 しかし、私は移動する前にこれについて確かめたいので、私の質問です:ELF実行可能ファイルからシンボル共有ライブラリの名前を見つける方法はありますか?ありがとうございました。
さて、私はBFDのobjdumpのと少しの原因を調査しました。私はELF仕様を読んだ。それに基づいて、実際に動的にリンクされていない限り、ダイナミックシンボルテーブル内のシンボルにライブラリ名を割り当てることはできないと思います。しかし、私はそれについて絶対に確信しているとは言えません、私は私が上に移動する前に私より多くの経験を持っている人とそれを議論したいと思います。 –
Ah - ok。私はあなたの元の質問を理解しているとは思わない。明確にするために、シンボルに基づいて、使用されているライブラリファイルを探したいと思いますか? Linuxでは、これはプログラムローダーによって行われます。シンボルはライブラリのキャッシュと一致します。ライブラリーが定義されており、そこから - 各インポートされたシンボルにライブラリの名前を割り当てることが可能である場合http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html – Josh
はい、私は不思議を参照してください。共有オブジェクトを実際にロードして検索することなく、実行可能ファイルのデータのみに基づいて動的リンク中にリンクされます。 –