web-dev-qa-db-ja.com

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

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

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

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

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

また、カーネルメモリ内にある実行可能ファイルの部分はありますか?

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

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

10
Dutchy

以下は本当に良いリファレンスです: 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に配置されます。

12
Wandering Logic