通常內核源碼存儲在/usr/src/linux-2.6.x/
。 爲了避免重新編譯整個內核,如果我修改模塊的源代碼,我該如何重新編譯該模塊?如何僅重新編譯單個內核模塊?
38
A
回答
52
切換到你的源代碼樹的根目錄,然後運行以下命令:
$ make modules SUBDIRS=drivers/the_module_directory
並安裝編譯的模塊:
$ make modules_install SUBDIRS=drivers/the_module_directory
注:作爲lunakid提到,後者命令可能是而不是先構建模塊,所以要小心。
7
您可以將路徑傳遞到模塊名稱或模塊目錄作爲參數。
make path/to/the/module/itself.ko
make path/to/the/module/directory/
+1
make path/to/the/module/itself.ko比make模塊SUBDIRS = directory/path(3 minuts vs 5 seconds)需要更多的時間。實際上,make path/to /目錄似乎不起作用,它總是說「沒事做」,但我修改了代碼 – 2015-06-07 18:25:04
5
因爲內核版本3.xx的和4.XX的程序變得更復雜(但有一個希望,所以請繼續閱讀):
make distclean
如果你還沒有剛剛克隆了一個新源,但用於構建其他模塊- 爲模塊源創建新文件夾(例如:多餘) 並僅複製源文件(從內核源文件或其他地方)需要建立到這個新文件夾
- 複製
/boot/config-``uname -r
文件(例如:/boot/config-4.8.0-46-generic)到內核源文件夾文件.config並運行make oldconfig
。如果模塊屬於內核源代碼,驗證是否已通過調用make menuconfig
啓用,通過搜索模塊和應用字母「M」如果有必要 - 內核源根的Makefile必須用準確版本組件匹配改變當前運行的一個(你可以用
make kernelversion
驗證它是否完全匹配的uname -r
之一) - 有過強烈的暗示與
make scripts
make prepare
和make modules_prepare
之前也構建腳本,必須以實際的模塊之前執行建立 個
- Module.symvers必須從目標系統頭夾相應的正在運行的內核版本
/usr/src/linux-headers-``uname -r``/Module.symvers
複製(例如:/usr/src/linux-headers-3.13.0-117-generic/Module.symvers)插入爲模塊編譯準備的新創建的模塊源文件文件夾(例如,一個額外的)。 - 創建新生成文件具有模塊源代碼編譯的文件夾下面的行內:
obj-y += <module_source_file_name>.o
或如果源代碼是複雜的,從here - 使用指引那麼它的構建模塊用
make -C <kernel source path> M=the_module_directory
合適的時間(例如:make -C . M=extra/
) - 使用命令
modprobe --dump-modversion <module_name>.ko
驗證模塊出口API和相應的值之間CRC匹配在Module.symvers - 驗證是否kernel.release文件內容與當前運行版本的標題完全匹配。如果您在末尾發現+,這意味着您一直在編譯git clonned源代碼,並且您的實驗性修改導致構建系統在最後添加+以損害localversion字符串。
- 如果只+已在kernel.release儲值的尾巴被發現,它是與目標運行的內核的確切名稱不匹配,
的解決辦法是以下幾點:
提交所有更改,使用git tag -a <tag version> -f
命令強制釋放標記以改變您的修改。然後從步驟重建模塊8
相關問題
- 1. 如何重新編譯單個Linux內核模塊?
- 2. 如何編譯Linux內核模塊
- 3. !編譯內核模塊
- 4. FTDI編譯內核模塊
- 5. Linux內核模塊編譯
- 6. Linux內核模塊編譯
- 7. 如何根據新的源編譯內核模塊
- 8. 如何在安裝新內核時自動執行linux內核模塊編譯?
- 9. 編譯linux內核模塊時出錯
- 10. 編譯Linux內核模塊(lincan)
- 11. 交叉編譯Linux內核模塊
- 12. 在Chromebook上編譯內核模塊
- 13. 編譯錯誤:內核模塊
- 14. 編譯內核模塊錯誤
- 15. 問題編譯內核模塊
- 16. 快速內核重新編譯
- 17. 使用gcc與內核頭文件編譯Linux內核模塊
- 18. 爲不同的內核編譯內核模塊
- 19. 其他內核的Linux內核模塊開發編譯
- 20. 我可以在不重新編譯整個內核的情況下使用gcov作爲內核模塊嗎?
- 21. 我們只能在內核源碼樹中重新編譯一個內核模塊嗎?
- 22. 如何提取內核頭文件以便稍後編譯內核模塊
- 23. 哪裏可以編譯新的內核模塊代碼
- 24. 無法在Android內核上編譯模塊:MODPOST 0模塊
- 25. 如何找到已編譯的內核模塊的版本?
- 26. 交叉編譯內核模塊:如何設置配置權
- 27. 如何使用-std = gnu99編譯Linux內核模塊?
- 28. 如何編譯Xperia S內核wifi模塊
- 29. 如何在Linux Ubuntu中編譯驅動程序/內核模塊?
- 30. 如何編寫Linux內核模塊?
(只要確保你運行的是,在樹根,不像我。)) – 2014-05-12 12:17:41
@lunakid好一點;)雖然它應該是很清楚,'SUBDIRS'相對於CWD :P – 2014-05-12 12:19:33
這絕對是清楚的,但我仍然發現自己最終坐在wacom驅動程序目錄中。 :)只是不看我的步驟。另外,你可以添加到你的答案,它也可以**安裝**相同的方式,只是把'make modules_install SUBDIRS = ...'。這幾乎可以肯定是下一步,並且可能不會馬上變得微不足道(即使看起來如此,例如,在我花了幾分鐘的時間用google搜索它後:))。 Thx,歡呼! – 2014-05-12 12:27:10