実行ファイル
プログラムを実行可能な形で格納したファイル。 単なる機械語の羅列ではなく、構造を持つ。
主な形式#
| 形式 | OS |
|---|---|
| ELF | Linux、多くの Unix |
| Mach-O | macOS、iOS |
| PE/COFF | Windows |
ELF の構造#
ELF ヘッダ … 種別、アーキテクチャ、エントリポイント
プログラムヘッダ表 … [[ローダ]]向け。何をどこに載せるか
セクション … .text .data .bss .rodata .symtab .rela
セクションヘッダ表 … [[リンカ]]向け同じファイルを、リンカとローダが別の見方で読むのが特徴。 リンカはセクション単位、ローダはセグメント単位で扱う。
主なセクション#
| セクション | 内容 |
|---|---|
.text |
機械語。読み取り専用・実行可能 |
.rodata |
定数、文字列リテラル |
.data |
初期値のある大域変数 |
.bss |
初期値 0 の変数。ファイルには場所だけ記録 |
.symtab |
シンボル表 |
.bss がファイル上で領域を占めないのは、
ゼロで埋めるだけならロード時にできるから。
巨大な配列を宣言してもファイルサイズが増えないのはこのため。
静的リンクと動的リンク#
| 静的 | 動的 | |
|---|---|---|
| ライブラリ | 実行ファイルに埋め込む | 実行時に読み込む |
| サイズ | 大きい | 小さい |
| 更新 | 再リンクが必要 | ライブラリだけ差し替え可 |
| 起動 | 速い | 解決の分だけ遅い |
セキュリティ修正をライブラリの差し替えだけで 配布できるのが動的リンクの大きな利点。 一方でコンテナ環境では静的リンクの再現性が好まれる。
参考文献#
- Tool Interface Standard (TIS). Executable and Linking Format (ELF) Specification, v1.2. https://refspecs.linuxfoundation.org/elf/elf.pdf
- Randal E. Bryant, David R. O’Hallaron. Computer Systems: A Programmer’s Perspective, 3rd ed. Pearson, 2016. https://csapp.cs.cmu.edu/
- John R. Levine. Linkers and Loaders. Morgan Kaufmann, 1999.