ELF
Linuxはexecveシステムコールを用いて、ELFの実行ファイルを起動する。
セクションはリンク、セグメントはロードの単位である。
セクションヘッダは追加と削除の為、ファイルの終端付近に配置される。
プログラムヘッダは順次的なロードの為、ファイルの先頭付近に配置される。
/usr/include/elf.hは移植性を持ち、/usr/include/linux/elf.hは固有の定義を利用できる。
動的リンクと共有ライブラリ
動的リンクは位置独立なライブラリを利用し、ディスクを節約する。
共有ライブラリは仮想アドレスを利用し、ライブラリを共有してメモリを節約する。
共有ライブラリは動的リンクを必要とするが、動的リンクの対象が共有ライブラリである必要は無い。
汎用OSは仮想アドレスが標準であり、動的リンクと共有ライブラリが混同されやすい。
共有ライブラリは絶対アドレスで指定できない為、関数ポインタを利用する。
関数ポインタの配列をGOT(Global Offset Table)、GOTを呼ぶ処理をPLT(Procedure Linkage Table)と呼び、例えばprintfのPLTは以下である。
printf@plt:
jmp *GOTのアドレス # 二回目以降
push $GOTのオフセット # 一回目
jmp 共通のアドレス解決ルーチン