ELFバイナリターゲットファイルの詳細
2738 ワード
以下は<>ノート
リンクプログラム
参照されているすべての外部モジュールを見つけてリンクします.これらの外部モジュールまたは関数ライブラリは、一般的に開発者、オペレーティングシステム、およびC実行ライブラリから来ています.
リンクプログラムはこれらの関数ライブラリを取り出し、ポインタの位置を改訂(再配置)し、モジュール内のシンボル解析を交差参照し、最終的に実行可能なモジュールを生成します.シンボルは、グローバルであってもローカルであってもよい.グローバルシンボルは、モジュール内で定義するか、別のモジュールの外部で参照できます.
静的ライブラリはリンク時に見つかってコピーされ、動的ライブラリと共有ライブラリは実行時にマウントされ、すべてのプロセスを共有します.linuxが提供するシステムはdlopen(),dlsym(),dlclose()を呼び出し、共有ライブラリをロード/開くために使用し、ライブラリ内のシンボルを検索し、共有ライブラリを閉じます.
ELFバイナリターゲットファイル
実行可能なELFターゲットファイルには、ELFヘッダ、プログラムヘッダテーブル(ロード用セクション)、第1セクション、第2セクションが含まれます...セクションヘッダテーブル(オプション)
1.ELFファイルヘッダ
2ヘッダー表
3非実行ELFファイルのセクション
bssは初期化データ
.data初期化データ
.hashシンボルハッシュリスト
.Init初期化コード
.Symtabシンボルテーブル
.text実行可能命令
.pltプロシージャリンクテーブル
.rodata読み取り専用データ
.dynamicダイナミックリンク情報
など
4プログラムヘッダテーブル
これらの情報により、システム関数exec()とリンクプログラムが協力して、実行可能プログラムのためにメモリにプロセスイメージを作成します.このプロセスは以下のとおりです.
1.実行可能ファイルのセグメントをメモリに追加
2.必要な共有ライブラリをすべてロード
3.必要に応じて実行可能ファイルとその共有オブジェクトにリダイレクト
4.制御権をプログラムに渡す
リンクプログラム
参照されているすべての外部モジュールを見つけてリンクします.これらの外部モジュールまたは関数ライブラリは、一般的に開発者、オペレーティングシステム、およびC実行ライブラリから来ています.
リンクプログラムはこれらの関数ライブラリを取り出し、ポインタの位置を改訂(再配置)し、モジュール内のシンボル解析を交差参照し、最終的に実行可能なモジュールを生成します.シンボルは、グローバルであってもローカルであってもよい.グローバルシンボルは、モジュール内で定義するか、別のモジュールの外部で参照できます.
静的ライブラリはリンク時に見つかってコピーされ、動的ライブラリと共有ライブラリは実行時にマウントされ、すべてのプロセスを共有します.linuxが提供するシステムはdlopen(),dlsym(),dlclose()を呼び出し、共有ライブラリをロード/開くために使用し、ライブラリ内のシンボルを検索し、共有ライブラリを閉じます.
ELFバイナリターゲットファイル
実行可能なELFターゲットファイルには、ELFヘッダ、プログラムヘッダテーブル(ロード用セクション)、第1セクション、第2セクションが含まれます...セクションヘッダテーブル(オプション)
1.ELFファイルヘッダ
typedef struct elf32_hdr{
unsigned char e_ident[EI_NIDENT]; // ELF
Elf32_Half e_type; // , , ,
Elf32_Half e_machine; //
Elf32_Word e_version; //
Elf32_Addr e_entry; /* Entry point */ //
Elf32_Off e_phoff; //
Elf32_Off e_shoff; //
Elf32_Word e_flags; //
Elf32_Half e_ehsize; // ELF
Elf32_Half e_phentsize; //
Elf32_Half e_phnum; //
Elf32_Half e_shentsize; //
Elf32_Half e_shnum; // ,
Elf32_Half e_shstrndx; //
} Elf32_Ehdr;
2ヘッダー表
typedef struct elf32_shdr {
Elf32_Word sh_name; //
Elf32_Word sh_type; //
Elf32_Word sh_flags; //
Elf32_Addr sh_addr; //
Elf32_Off sh_offset; // ELF
Elf32_Word sh_size; //
Elf32_Word sh_link; //
Elf32_Word sh_info; //
Elf32_Word sh_addralign; //
Elf32_Word sh_entsize; //
} Elf32_Shdr;
3非実行ELFファイルのセクション
bssは初期化データ
.data初期化データ
.hashシンボルハッシュリスト
.Init初期化コード
.Symtabシンボルテーブル
.text実行可能命令
.pltプロシージャリンクテーブル
.rodata読み取り専用データ
.dynamicダイナミックリンク情報
など
4プログラムヘッダテーブル
typedef struct elf64_phdr {
Elf64_Word p_type; //
Elf64_Word p_flags; // p_type
Elf64_Off p_offset; //
Elf64_Addr p_vaddr; //
Elf64_Addr p_paddr; //
Elf64_Xword p_filesz; //
Elf64_Xword p_memsz; //
Elf64_Xword p_align; // , 2
} Elf64_Phdr;
これらの情報により、システム関数exec()とリンクプログラムが協力して、実行可能プログラムのためにメモリにプロセスイメージを作成します.このプロセスは以下のとおりです.
1.実行可能ファイルのセグメントをメモリに追加
2.必要な共有ライブラリをすべてロード
3.必要に応じて実行可能ファイルとその共有オブジェクトにリダイレクト
4.制御権をプログラムに渡す