ELF実行可能ファイルのどの部分がメモリにロードされ、どこにありますか?

ELF実行可能ファイルのどの部分がメモリにロードされ、どこにありますか?

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

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

私が興味のある部分は、.plt、.got、.dynamic、.dynsym、.dynstrなどの部分です。機能をアドレスにリンクする役割を担うELF部分です。

これまでに私が学んだことは、.symtabや.strtabのようなものがメモリにロードされないか保持されないということです。しかし、リンカは.dynsymと.dynstrを使用しますか?まだ記憶の中にいますか?プログラムコードからアクセスできますか?

実行ファイルの一部はカーネルメモリにありますか?

これに対する私の関心は主に法医学ですが、このトピックに関する情報があれば役に立ちます。これらのテーブルとダイナミックリンクについて私が読んだリソースはより高度であり、メモリ内のコンテンツの実際のコンテンツではなく、どのように機能するかを説明します。

私の質問に不明な点があれば教えてください。

ベストアンサー1

以下は非常に良い参考資料です。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部分(または.gnuを持たない古い共有オブジェクトの.hash部分)を検索してこれを行います。リンクされた共有オブジェクトで正しいアドレスが見つかったら、それを共有オブジェクトの.gotまたは.pltに配置します。

おすすめ記事