ELF実行可能ファイルのどの部分がメモリに読み込まれますか?


10

私がすでに知っていること:

ELF実行可能ファイルにはいくつかのセクションがあり、.textセクションと.dataセクションはプログラムの主要な部分であるため、メモリにロードされます。しかし、プログラムが機能するためには、特に動的にリンクされている場合、より多くの情報が必要です。

私が興味を持っているのは、.plt、.got、.dynamic、.dynsym、.dynstrなどのセクションです。関数とアドレスのリンクを担当するELFの部分。

私がこれまでに理解できたことから、.symtabや.strtabなどのものがメモリにロードされない(またはとどまらない)ことです。しかし、リンカは.dynsymと.dynstrを使用していますか?彼らは記憶に残っていますか?プログラムコードからそれらにアクセスできますか?

そして、カーネルメモリに常駐する実行可能ファイルの部分はありますか?

これに対する私の関心は主に法医学ですが、このトピックに関する情報があれば役立ちます。これらのテーブルと動的リンクについて私が読んだリソースはより高レベルであり、それらは動作を説明するだけであり、メモリの内容について実用的なものは何もありません。

質問について不明な点がある場合はお知らせください。

回答:


12

以下は非常に優れたリファレンスです:http : //www.ibm.com/developerworks/linux/library/l-dynamic-libraries/。さまざまなレベルのさまざまな参照の最後に参考文献が含まれています。あらゆる詳細な情報を知りたい場合は、ソースhttp://www.akkadia.org/drepper/dsohowto.pdfに直接アクセスできます。(Ulrich DrepperがLinux動的リンカーを作成しました。)

"objdump -h myexe"や "readelf -S myexe"などのコマンドを実行すると、実行可能ファイルのすべてのセクションの概要がわかります。

.interpセクションには、このオブジェクトのシンボルを動的にリンクするために使用されるダイナミックローダーの名前が含まれています。.dynamicセクションは、ダイナミックローダーが読みやすいようにフォーマットされたプログラムヘッダーの抽出です。(したがって、他のすべてのセクションへのポインターがあります。)

.got(グローバルオフセットテーブル)と.plt(プロシージャリンクテーブル)は、動的リンカーによって操作される2つの主要な構造です。.gotは変数の間接参照テーブルであり、.pltは関数の間接参照テーブルです。各実行可能ファイルまたはライブラリ(「共有オブジェクト」と呼ばれます)には独自の.gotと.pltがあり、これらは実際には他の共有オブジェクトに含まれている、その共有オブジェクトによって参照されるシンボルのテーブルです。

.dynsynには、共有オブジェクト内のシンボルに関するすべての情報(ユーザーが定義するものと参照する必要のある外部の両方)が含まれています。.dynsynには実際のシンボル名は含まれていません。それらは.dynstrに含まれており、.dynsynは.dynstrへのポインターを持っています。.gnu.hashは、シンボルを名前ですばやく検索するために使用されるハッシュテーブルです。また、ポインター(.dynstrへのポインター、およびバケットチェーンの作成に使用されるポインター)も含まれています。

共有オブジェクトがいくつかのシンボル「foo」を逆参照する場合、動的リンカーは、リンクされているすべての動的オブジェクトで「foo」を検索して、探している「foo」が含まれているオブジェクトを特定する必要があります。 "foo"のアドレスはその共有オブジェクト内にあります。)ダイナミックリンカーは、リンクされたすべての共有オブジェクトの.gnu.hashセクション(または.gashを持たない古い共有オブジェクトの.hashセクション)を検索することでこれを行います。ハッシュセクション。)リンクされた共有オブジェクトで正しいアドレスが見つかると、共有オブジェクトの.gotまたは.pltに配置されます。


ありがとう、あなたのリンクは私が必要とするセクションの仮想マッピングを見つけることにおいて私をさらに一歩前進させます。これに対する私の興味は法医学的なものであるため、「DRAMにロードされる」は依然として私にとって重要です。セクションがマップされているがロードされていない場合、メモリダンプでセクションを見つけることができません:)
Dutchy

あなたが正しいです。メモリダンプを実行すると、マップされたすべてのページのコピーが取得されるため、「vmにマップ」と「DRAMにロード」の違いは関係ありませんでした。私はその文を削除し、答えが改善されました。ありがとうございました!
Wandering Logic

あなたの答えを答えとしてマークしました、それは私が得るつもりであるのと同じくらい多くの情報だからです:)残りは自分でしなければならないでしょう、それは結局私の研究です。
ダッチ:2013

したがって、はい.dynsymおよび.dynstr(およびその他)は動的リンカーによって使用され、プログラムメモリ(テキストセグメント内)にロードされ、実行時にプログラムによって使用できます。
ysdx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.