2.2. Makefile内の変数

ターゲットbootblockとkernelを見る前に、Makefile内の変数を確認する。
変数CCがgccなのでコンパイラにはgccを使う。
変数CFLAGSは後ろの方が環境によって変わるようなので、makeを実行して中身を確認すると以下のようになっていることが分かる。
CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector
各オプションの意味はマニュアル「Using the GNU Compiler Collection (GCC)」(リンク3)を見るとだいたいわかる。 知りたいオプションをOption Summaryページでページ内検索して、各ページに飛ぶのと楽。

Option意味
fno-picマニュアルにこのオプションの記載はないが、fpicオプションはあるのでその否定だとわかる。出力を位置独立コード(Position Independent Code)にしない。位置独立コードに関しては「リンカ・ローダ 実践開発テクニック」(書籍1)に詳しく載っている。
static動的ライブラリを静的リンクする。
fno-builtin組み込み関数を使わないようにする。
O2レベル2の最適化オプションを有効にする。
Wall警告オプションを有効にする。
MD拡張子「*.d」ファイルを作成し、依存関係にあるファイル名を書き込んでくれる。
ggdbgdbで使用するデバッグ情報を作る。
m32int, long, ポインタを32bitにする。
Werror全ての警告をエラーにする。
fno-omit-frame-pointerfomit-frame-pointerオプションの否定。関数呼び出しにて必ずベースポインタを使う。
fno-stack-protectorfstack-protectorオプションの否定。バッファオーバーフローやスタックスマッシング攻撃をチェックするコードを追加しない。

変数LDがldなのでリンカはldを使うことが分かる。
変数LDFLAGSもCFLAGS同様にmakeを実行して出力を確認すると以下のようになっていることが分かる。
LDFLAGS = -m elf_i386
オプションの意味はマニュアル「Using ld The GNU linker ld version 2 January 1994」(リンク4)で確認できる。このマニュアルはIndexからオプションが簡単に探せる。

Option意味
m指定したリンカをエミュレートする。ここではelf_i386をエミュレート。elfについては「リンカ・ローダ 実践開発テクニック」(書籍1)に詳しく記載されている。

変数OBJDUMPはobjdump。
変数OBJCOPYはobjcopy。マニュアル「3 objcopy」(リンク5)によると、Oオプションで出力ファイルのフォーマットを指定できる。また、出力フォーマットにバイナリを指定した場合、オブジェクトには以下の3つのシンボルが作成され、プログラムからデータにアクセスすることができる。

  • _binary_<ファイル名>_start
  • _binary_<ファイル名>_end
  • _binary_<ファイル名>_size

例えば画像ファイルをオブジェクトファイルに変換し、プログラム内で上記シンボルからアクセスすることができる。
これらのシンボルはリンカldのbオプションでバイナリを指定した際にも作成される。