実行ファイル

実行ファイル

執筆済 コンピュータ

プログラムを実行可能な形で格納したファイル。 単なる機械語の羅列ではなく、構造を持つ。

主な形式#

形式 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 がファイル上で領域を占めないのは、 ゼロで埋めるだけならロード時にできるから。 巨大な配列を宣言してもファイルサイズが増えないのはこのため。

静的リンクと動的リンク#

静的 動的
ライブラリ 実行ファイルに埋め込む 実行時に読み込む
サイズ 大きい 小さい
更新 再リンクが必要 ライブラリだけ差し替え可
起動 速い 解決の分だけ遅い

セキュリティ修正をライブラリの差し替えだけで 配布できるのが動的リンクの大きな利点。 一方でコンテナ環境では静的リンクの再現性が好まれる。

参考文献#

ノート一覧を閉じる