ELFバイナリターゲットファイルの詳細

2738 ワード

以下は<>ノート
リンクプログラム
参照されているすべての外部モジュールを見つけてリンクします.これらの外部モジュールまたは関数ライブラリは、一般的に開発者、オペレーティングシステム、および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.制御権をプログラムに渡す