web-dev-qa-db-ja.com

単一のカーネルモジュールだけを再コンパイルする方法は?

通常、カーネルソースは/usr/src/linux-2.6.x/に保存されます。モジュールのソースを変更した場合にカーネル全体を再コンパイルしないようにするには、そのモジュールだけを再コンパイルするにはどうすればよいですか?

47
user1056635

ソースツリーのルートディレクトリに切り替えて、次のコマンドを実行します。

$ make modules SUBDIRS=drivers/the_module_directory

そして、コンパイルされたモジュールをインストールするには:

$ make modules_install SUBDIRS=drivers/the_module_directory

注: lunakidが述べているように、後者のコマンドはnot最初にモジュールをビルドするので、注意してください。

56
Niklas B.

カーネルバージョン3.xxおよび4.xx複雑です(ただし、希望があるので読み続けてください):

  1. make distclean新しいソースを複製したばかりでなく、以前に他のモジュールをビルドするために使用した場合
  2. モジュールソースのどこかに新しいフォルダーを作成し(例:extra)、必要なモジュールに関連するソースファイルのみ(カーネルソースまたは他の場所から)をコピーしますこの新しいフォルダにビルドする
  3. /boot/config-`uname -r`ファイル(例:/ boot/config-4.8.0-46-generic)をカーネルソースフォルダーファイル。configおよびmake oldconfigを実行します。モジュールがカーネルソースに属している場合は、make menuconfigを呼び出して、モジュールを検索し、必要に応じて文字「M」を適用して、モジュールが有効になっているかどうかを確認します
  4. カーネルソースルートMakefileは、現在実行中のコンポーネントに一致する正確なバージョンコンポーネントで変更する必要があります(完全に一致する場合は、make kernelversionで確認できます) uname -rone)
  5. 以前にもmake scriptsを使用してスクリプトを作成することを強くお勧めします
  6. make prepareおよびmake modules_prepareは、実際のモジュールのビルドの前に実行する必要があります
  7. Module.symversは、実行中のカーネルバージョン/usr/src/linux-headers-`uname -r`/Module.symversに対応するターゲットシステムヘッダーフォルダーからコピーする必要があります(例:/ usr/src/linux-headers-3.13.0-117-generic/Module.symvers)を、モジュールのコンパイルに備えて新しく作成されたモジュールソースファイルフォルダー(1つextra例)。
  8. create newMakefile次の行を持つモジュールソースコンパイルフォルダー内:obj-y += <module_source_file_name>.oまたはソースコードが複雑な場合は、 here
  9. そうしてはじめて、make -C <kernel source path> M=the_module_directory(例:make -C . M=extra/)でモジュールをビルドするのが適切です
  10. コマンドmodprobe --dump-modversion <module_name>.koを使用して、モジュールエクスポートAPIとModule.symversの対応する値との間のCRCの一致を確認します。失敗した場合は、代わりにコマンドmodinfo <module_name>.koを使用してください
  11. kernel.releaseファイルの内容が現在実行中のバージョンのヘッダーの内容と正確に一致するかどうかを確認します。最後に追加された+を発見した場合は、git clonnedソースをコンパイルしており、実験的な変更によってビルドシステムがlocalversionを危険にさらしたことを意味します。末尾に+を追加して文字列を作成します。
  12. +のみがkernel.releaseの末尾に保存されている場合値と、実行中のカーネルの正確な名前との不一致

解決策は次のとおりです。

すべての変更をコミットし、git tag -a <tag version> -fコマンドを使用してリリースタグを強制的に変更の上に移動します。次に、ステップ8からモジュールを再構築します

10
Oleg Kokorin

パラメータとして作成するモジュール名またはモジュールディレクトリへのパスを渡すことができます。

make path/to/the/module/itself.ko
make path/to/the/module/directory/
7
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

https://askubuntu.com/questions/515407/how-recipe-to-build-only-one-kernel-module

3
rocky

Drivers/net/ethernet/intel/e1000/e1000_main.cファイルのコードだけを編集した場合

モジュールをビルドします。

make scripts prepare modules_prepare
make -C . M=drivers/net/ethernet/intel/e1000

モジュールをインストールします。

cp drivers/net/ethernet/intel/e1000/e1000.ko /lib/modules/5.1.15/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
0
siz