質問: 現在、「ゼロからのOS自作入門」という書籍で学習をしております。 言語はC++で、書籍内ではclang++で解説されているところ、私はg++を使って挑戦しております。 その中で、カーネルのelfファイルをビルドする際、clang++の-nostdlibincオプションをg++のオプションで置き換える必要が出たのですが、clang++とg++のリファレンスを参照しても、代替コマンドが分かりません。 代替コマンドをご存知の方は、お教えいただきたいです。 置き換えたいclang++オプションは以下のようなものです。 `-I(インクルードディレクトリ) -nostdlibinc -D__ELF__ -D_LDBL_EQ_DBL -D_GNU_SOURCE -D_POSIX_TIMERS --target=x86-64-elf -fno-exceptions -ffreestanding -c` --target=x86-64-elfオプションは、-m64オプションで置き換えられることを確認できました。 環境はUbuntu 20.04.2 LTS コンパイラはg++ 9.3.0です。 よろしくお願いいたします。
回答: OS を自作するということは即ち開発環境の OS 上で動かないプログラムを作ろうとしているということです。当然「今動いている OS を呼ぶ用」のヘッダファイルやライブラリファイルを使うことはできません。こういう状況をクロス開発と言いますが、組み込み系マイコンやスマホアプリの開発だったりでは一般的です。 * ターゲットプログラムの CPU が開発環境の CPU と違う場合 組み込みマイコン開発などはこっちです。クロス系ツール一式は最初から開発環境向けのコンパイラ・リンカ・ヘッダ・ライブラリを使ってはならないと知っています。なので **クロス開発専用環境** においては `-nostd***` などは指定する必要がありません(指定しなくても開発環境用のヘッダ・ライブラリを使わない仕様) * ターゲットプログラムの CPU が開発環境の CPU と同じ場合 今質問者氏が直面しているのはこっちですが、前者より状況は複雑です。っつか一番難しい環境かも。 ・コンパイラ・リンカは同じものが使える(であろう):これらは CPU にのみ依存する ・ヘッダやライブラリは同じものが使えない:これらはターゲット依存 そのため流用できる開発環境向けコンパイラ・リンカに対して、流用できない開発環境向けヘッダ・ライブラリを使っちゃダメよという指定を行う必要があり、それが `-nostdinc` / `-nostdlib` です。 この辺のクロス開発用オプションは [gcc](/questions/tagged/gcc "'gcc' のタグが付いた質問を表示") と [clang](/questions/tagged/clang "'clang' のタグが付いた質問を表示") で微妙に異なるようです。クロス開発において、ホスト環境にある各種ファイルのうち流用できるものとできないものがわかっていないとどのコンパイルオプションが必要か判断できませんので、その辺は経験値が必要かもしれません。 # `-nostdinc++` は [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") の STL を禁止しますが `` のようなものは流用できなさそうなのに対して `` なんかは流用できそうだったりします