Linux カーネルが GCC でしかコンパイルできないのはなぜですか? 一部のプロジェクトで本当に必要な GNU C 拡張機能とその理由は何ですか?
4 に答える
Linuxカーネルが使用するgcc拡張機能は次のとおりです。
- インラインアセンブリ
- __builtin_expect、__ builtin_constant、__builtin_return_addressなどのgccビルトイン
- 使用するレジスタなどを指定する関数属性(例:__ attribute __((regparm(0))、__ attribute __((packed、aligned(PAGE_SIZE)))))
- gccの事前定義されたマクロに依存する特定のコード(たとえば、特定のバージョンでの特定のgccバグの回避策)
- スイッチケースの範囲(ケース8 ... 15 :)
さらにいくつかあります:http ://www.ibm.com/developerworks/linux/library/l-gcc-hacks/
これらのgccの詳細の多くは、アーキテクチャに大きく依存しているか、gccの実装方法によって可能になり、おそらくC標準で指定しても意味がありません。その他はCの便利な拡張機能です。Linuxカーネルはこれらの拡張機能に依存するように構築されているため、他のコンパイラーはカーネルを構築できるようにgccと同じ拡張機能を提供する必要があります。
Linuxがgccのこれらの機能に依存しなければならなかったわけではありません。たとえば、NetBSDカーネルはgcc固有のものにほとんど依存していません。
GCCは、C99標準の一部ではないネストされた関数をサポートします。とは言うものの、それらが実際にLinuxカーネル内でどれほど普及しているかを確認するには、いくつかの分析が必要です。
Linux カーネルは GCC によってコンパイルされるように作成されていたため、標準への準拠はカーネル開発者の目的ではありませんでした。
また、GCC がコーディングを容易にしたり、コンパイルされたカーネルを小さくしたり高速にしたりする便利な拡張機能を提供している場合、これらの拡張機能を使用するのは当然の選択でした。
本当に必要なのではないかと思います。便利なものがたくさんあり、クロスコンパイラの移植性は、Linuxカーネルが優れた機能を放棄するのにそれほど問題ではありません。拡張機能に依存することを取り除くには、膨大な量の作業が必要になることは言うまでもありません。