System Development
 

システム開発 - ChinaUnix.net数(rpm) - ELFの動的リンカの原理設計とコードファイル

はじめに:
それは簡単にするために、これは移転とGOTクラスなどの弱い型変数など、いくつかの詳細の説明の必要性を排除する
タイプ。
この資料では、読者は、ELFファイルフォーマットを理解していることを前提としています。コード附属書。
フォーラムは、添付ファイルをサポートしていない場合、あなたは私にメールを送ることができます





ELFのセクションで、ドキュメントのプログラムの内容つの構造を記述して使用して、ファイル。一般的には、ELFの再配置可能ファイルを使用して、ELF形式の実行可能ファイルのセクションです
プログラムは、再リンクファイルは、両方を使用されている。
負荷がファイルかどうかを決定するためにセクションまたはプログラムの種類の属性を使用して、実際には非常に単純なプロセスです。
、ロードする必要があるし、ファイル内のオフセット属性データを見つけるには、それができる適切なメモリ位置に(コピー)をお読みだろう。この位置は、あなたの中にプログラムすることができます
vaddrプロパティが決定します。懸念セクションには、負荷の位置を定義することができます。
2 ELFファイルの再配置
接続の動的な性質は、ELFファイルです




リファレンス動的なデータ(データのリンクが存在しない)。
ビューのプロセスの観点から、我々は再検索する必要がある。とシンボル解決は、それが移転プロセスの支店です。
私をしておきます
我々は、単に移転の原則を導入する。
私たちは、アセンブラのソースコードを書くと仮定
jmp dxc
dxc:
……
ユニと仮定すると
ラベルのアドレス1000hの。
次に、リンクをコンパイルし、それは、JMP 1000hのなる。

。我々は(関数の内部でのダイナミックリンクライブラリなどの)外部シンボルを使用する場合、リンクはこのシンボルは、その方法がない場所がわからない
を生成するアドレス1000hの。
移転の目的は、1000h番地のアドレスを変更して実行して正しいアドレスを指すようにするためです。(リンクは、再配置する必要がある場合、脇に置く)。
移転については、私たちは、3つのデータを必要とする。
1は、移転のアドレスであり、この命令は、オペランドアドレスのjmp 1000hのですが1000hの自身のものである
メモリ内のアドレス。(あなたが独自のストレージアドレス&ポイントするためにCへのポインタとして、それを想像することができます)
図2は、シンボルを指すようにする必要がある場合、上記の例では、ラベルがユニです。
。(あなたはまた考えることができる点Cのポインタのアドレスを指す)
3はR_386_32などの再配置のタイプであり、
それは絶対的な再配置は、R_386_PC32は、相対アドレスの再配置を表現。相対アドレスを取得する - 後者の使用は、"再配置アドレスシンボルアドレス"がシンボルの元アドレスは、直接使用することができます。
再配置型では、してくださいその他のは、ELFホワイトペーパーを参照してください。。
再配置テーブルには、再配置エントリの配列がたくさんある。
以下は、再配置エントリ構造内のELFている
struct elf32_rel {
Elf32_Addr r_offset;
Elf32_Word r_info;
//SYMBOL<<8+TYPE&0xff.
} ;
r_offsetは、アドレスの再配置が必要です。
SYMBOL
シンボルの将来の移転を指すようにする必要がです。


することができます再配置。
3 ELFファイルのシンボル解決
上記のアルゴリズムでは、"記号2〜解析に言及すると、実行するために得ることができる場合、正しくシンボルを
アドレスのシンボリック解析"仕事"それが行う方法、特定の"。
いわゆるさで、"分析は、記号"事実は:指定されたシンボル名、メモリ内の正しいアドレスのシンボルを見つける。

ELFのシンボル解決は、"シンボルテーブル"を介している"シンボリック名は"達成するために、ファイル。
の終わりにシンボリック名は、多くのコレクションの可変長文字列、および2つに'\ 0'。
シンボル


struct elf32_sym{
Elf32_Word
st_name; //index into the symbol string table
Elf32_Addr
st_value;
Elf32_Word st_size;
//size of the symbol. 0 for no size or unkown size
unsigned char
st_info; //BIND<<4+TYPE&0x0f
unsigned char st_other;
//0 for reserve
Elf32_Half st_shndx;
//relevant section table index, some indicates special meanings
};
St_name
(下記参照)の記号インデックスの名前です
St_value(下記参照)をメモリ内のシンボルのアドレスです。
st_sizeは、バイトのシンボルの大きさ
ユニット
BINDには、そのシンボルは、内部または外部シンボルシンボルです
TYPEは、シンボルの型を示し、関数、または変数、といったようになります
st_otherは定数0、ポールです
左はバイト
st_shndxは、シンボルインデックスが(下記参照)のセクションです

。St_nameは、"シンボル名のベースアドレス"を介して、インデックス値を指すシンボリックリンク名のリストです+ st_nameは、シンボル名のアドレスを取得することができます。
理由は、このアプローチには
シンボリック名の"可変長"の取り扱いについて。
。。
mMyLinkTypeofDoubleLoaderProgram int型34文字がある。配列のアプローチを使用して、多くのスペースを、malloc関数から無駄にする場合は
ていないハードディスクストレージの動的メモリに適して。
ハードディスクストレージに関連して、インデックスを使用することができます+文字列テーブルに格納された変数の長さの文字列(または他の変数の長さの情報 - これは非常に価値のある学習スキルです



再配置可能ファイルには、st_valueシンボルオフセットセクションの先頭アドレスを基準にして、このセクションはst_shndexで指定される
(ことを除いてはほとんど使用されるセクションの共通タイプ)。

。。動的リンクの中に、私たちは"現在のロードアドレス"と"スケジュールされたロードアドレス"の違いを計算する必要があります。
4
ELFの機能設計を読み込む
全体的なプロセス:
トラバースセクションヘッダテーブル、フェスティバルをロードするすべての必要性、および再配置情報セクションの
2


移転のプロセス:
トラバースの再配置セクションは、1、その各々の移転は、アイテム
治療後



移転の0の場合、実装:
R_386_32:*のP値= * pは+ Sを
R_386_PC32:* pの=*のP +のS - Pを
のS C2の場合


再分析。
コードを読んで、ソースコードの一部が、オペレーティングシステムコンポーネントの私のデザイン、見もせずにスキップすることができます。
通常はダイナミックリンカによると、"使用する