私はうまく動作する最新(3.16-rc2)カーネルを構築しました。私のユーザースペースプログラムはfcntrl.hなどでいくつかの新しい定義を使用しているので、最新のヘッダーにリンクする必要があります。
私の質問は、 "make headers_install"を実行するときに古いカーネルのヘッダをどのように保持しますか?
実行中の場合
make headers_install INSTALL_HDR_PATH=/usr/src/kernels/`uname -r`
/usr/src/include がまだ PATH にあるため、ヘッダー定義が競合します。
この問題を処理する正しい方法は何ですか?
答え1
#include
同じパスに2つのヘッダーを使用することはできませんが、通常のパスの外側にヘッダーをインストールし、-I
適切なスイッチ(gccの場合)でコンパイルするときにそのヘッダーを置き換えることができます。私は既にこれを理解していると思うので、通常のインクルードasm/fcntl.h
ディレクトリ内に複数のディレクトリを置くと、これを実現するために多くの考えは必要ありません。とにかく、どちらか一方のみが適用されます。
それでもあまり心配する必要はないと思います。ご意見の一部から始めてください。
最新のカーネルメカニズムを使用するユーザースペースプログラムのこれらの機能は無効にすることができます。
これはいいですね。#define NEWVALUE 666
必要な場合編む、これには最新のカーネルでのみ機能する機能が含まれます。これらの機能をキャプチャまたは無効にできます。それ以外の場合、実際のアプリケーション部分はNEWVALUE
呼び出されません。古いカーネルが実行されているときに利用可能なヘッダーが定義されていないということではないことに注意してください。下痢だったとしても問題になりません。なぜなら、ランタイムの実際の問題は、実際にカーネルの一部を呼び出すことだからです。存在しないカーネル。コアABI。ヘッダーはまったく必要ありません走る実行可能ファイルなので、古いカーネルに戻ることは重要ではありません。
私は少し妄想的かもしれませんが...
はい、いいえ。これが残っているものをコンパイルし、後で古いカーネルで実行するときに新しい機能を活用するために、複数の人々がランダムに異なるカーネルヘッダを置き換えるシステムであれば、編集者は適切な反応になります。しかし、実際にこのカテゴリに属するものはあまりありません。
Distrosはアップグレードするたびにカーネルヘッダーを置き換えますが、同時に交換する必要があるユーザースペースのリストは通常それほど長くないようです(存在する場合)。部分的にはこの場合、以前のバージョンとの互換性を維持するのが簡単すぎるためだと思いますが、この場合は時間が経っても状況が大きく変わらないためだと思います。
以前のタイトルを保存して再インストールできると思いました。
これを行うか、必要に応じて適切なソースで交換することができます(make headers_install
)。 distroカーネルでパッチが適用される可能性があるという懸念がある場合は、そのdistroのソースパッケージが必要です。