Vmlinux
oはカーネルイメージの先頭メモリアドレスに存在するコードである。エントリーポイント_startから開始されるこのコードにより前述した伸長用ルーチンを後ほど呼び出す。
このコードは以前のリリースにおける、2つのコードbootsect.o、setup.oの一部を抜きだし、再構成したものである。ちなみにbootsect.oはフロッピーディスク用のダイレクトブート用コードであったがバージョン2.6では、header.Sの一部にダイレクトブートできない旨のメッセージを表示するコードのみ残っているに過ぎない。setup.oの残部は細かく分けられ、一部は前述のhead_$(BITS).oにも含まれている。
このオブジェクトファイルも含め、ビデオBIOS用処理などの低レベルなコードがarch/x86/boot/setup.elfという実行ファイルとしてリンクされる。
ここまで正常に終了したならば、bzImageの完成は目前となる。arch/x86/boot/setup.elfとarch/x86/boot/compressed/vmlinuxはobjcopyコマンドの特殊なオプションによりそれぞれELFバイナリからrawバイナリ(「生バイナリ」とも。リロケーション情報を削除し、メモリ上に直接展開・実行可能なコード。詳細はobjcopyのマニュアルまたはInfoドキュメントを参照せよ)arch/x86/boot/setup.binとarch/x86/boot/vmlinux.
head_$(BITS).o, misc.oその他カーネルイメージの伸長後に利用する低レベルコードをビルドし終わると、piggy.oというオブジェクトコードと一緒にリンクされ、arch/x86/boot/compressed/vmlinuxという実行ファイルを生成する(このファイルは本記事で説明の対象としているvmlinuxではないことに注意せよ)。piggy.oは次のようなプロセスをたどり生成される。ディレクトリのトップにあるvmlinuxは、GNU Binutilsにより配布されるobjcopyコマンドを利用し、.commentなど不要なELFセクションヘッダとシンボル情報を全て削除されたうえで実行ファイルarch/x86/boot/compressed/vmlinux.binに変換される。このファイルに圧縮をかけ更に専用のツールを用いて、vmlinux.bin.gz(圧縮アルゴリズムにより拡張子は異なる)をELFのセクションヘッダに埋め込んだ特殊なELFオブジェクトファイルが生成される。これがpiggy.oである(詳しくはarch/x86/boot/compressed/Makefileを参照せよ)。
この後ブート用の低レベルコードのビルドが続く。カーネルのブートに関するコードは前述の圧縮・伸長コードも含め、arch/x86/bootに存在する。
arch/x86/boot/header.