■ コラム(2章のp.37に挿入)「セクション・ヘッダとプログラム・ヘッダの位置」 ---------------------------------------------------------------- ELF形式ではファイル先頭付近にプログラム・ヘッダ・テーブルがあり, ファイル末尾にセクション・ヘッダ・テーブルがあるという構成になって います.一見すると,なぜこのようなことになっているのか疑問に思って しまうような構成です.(事実,筆者はこれが非常に疑問でした) 筆者の推測では,この理由はセクション・ヘッダとプログラム・ヘッダの 目的にあるように思います. セクション・ヘッダはリンカが参照するものですから,リンク後には 必ず必要というものではありません.実行形式のサイズ削減のために 削除してしまってもいいし,ロード時に実際にロードせずに捨てられて しまっても構いません.このため削除されたときにセグメントの オフセットに影響を与えないように,末尾にまとめてあるのだと思われます. 対してプログラム・ヘッダはローダが参照するものであるため, 実行形式から削除することはできません. さらに組み込み機器などで,(シリアル経由などで)実行形式ファイルを ダウンロードして展開したい場合には,ダウンロードしたファイルをいったん バッファ上に置いてから,実際のメモリ上に展開するのが簡単です. しかしメモリ節約のため,バッファを用いずに,ダウンロードしながら 実際の展開先に直接展開していく方法を取りたい場合があります. この場合,展開先の情報(プログラム・ヘッダ)がファイル先頭付近にないと, この方法を実現することができません.このためプログラム・ヘッダは ファイル先頭付近に置くことになっているのだと思われます. (例えば組み込みシステムで頻繁に利用されるモトローラSレコード・フォーマット では,展開先情報の後に実際のデータが続くフォーマットになっており, ダウンロードしながらメモリ上に直接展開するのに向いた構造になっています) ----------------------------------------------------------------