web-dev-qa-db-ja.com

/ usr / include / sysと/ usr / include / linuxの違いは?

まあ、明らかに違いがありますが、なぜ/ usr/include/sysの下にあるものと/ usr/include/linuxの下にあり、同じヘッダーファイル名を持つものがあるのか​​、その背後にある合理性に興味がありますか?これはPOSIXvx non-POSIXと関係がありますか?

また、カーネルヘッダーパッケージを取得することで、Fedoraシステムのヘッダーを/ usr/include/linuxに設定できました。/usr/include/sysの下にあるヘッダーファイルを取得するための標準パッケージ名があります。 ?私はそれを見つけることができませんでした。

12
Jeff

/usr/include/linuxおよび/usr/include/asm*の下のヘッダーは、Linuxカーネルとともに配布されます。他のヘッダー(/usr/include/sys/*.h/usr/include/bits/*.h、その他多数)は、すべての非組み込みLinuxでCライブラリ( GNU Cライブラリ 、別名glibc)とともに配布されます。システム)。少しあります glibcマニュアルの説明

/usr/include/linux/usr/include/asmには、実行中のカーネルのヘッ​​ダーではなく、Cライブラリのコンパイル時に使用されたヘッダーを含める必要があることに注意してください。そうしないと、一部の定数またはデータ構造が変更された場合、コンパイルされたプログラムとCライブラリの間に不整合が生じ、クラッシュまたは悪化する可能性があります。 (ヘッダーがCライブラリと一致するが、Cライブラリがカーネルと一致しない場合、実際に起こるのは、カーネルが安定したABIを維持するように設計されており、異なるABIで呼び出されたことを検出し、それに応じてsyscall引数を解釈する必要があることです。とにかく、カーネルは静的にコンパイルされたプログラムに対してこれを行う必要があります。)

しばらく前(10年?)に/usr/include/linuxの問題についてDebianとRedHatの間で激しい議論があったことを覚えています。どうやらそれぞれの側がその位置に固執しています。 (私が理解している限り、Debianは上で説明したように正しいです。)Debianは現在、カーネルソースからコンパイルされた /usr/include/linux パッケージでlinux-libc-devとその仲間を配布していますがカーネルでアップグレードされていません。カーネルヘッダーはバージョン固有のパッケージであり、 linux-headers-2.6 メタパッケージを提供します。これは、特定のカーネルバージョンのモジュールをコンパイルするために必要なものです。

探しているパッケージはCライブラリヘッダーです。何と呼ばれているのかわかりませんが、yum provides /usr/include/sys/types.hで確認できます。