Linux-Kernel

壓縮模組時,armv7l 的模組生成文件失敗

  • July 3, 2018

我已經使用 netfilter 編寫了一個網路鉤子。這個模組在我的 ubuntu 16.04 上成功編譯。

現在我想在我的嵌入式板上編譯它,它使用定制的 Linux,在我的筆記型電腦中使用相同版本的核心。唯一的問題是我的嵌入式板中的所有模組都是.ko.xz格式的,我的 makefile 失敗了,我不知道如何解決這個問題。

我原來的makefile是:

obj-m += sysfirewall.o
all:
   make -C  /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) modules
clean:
   make -C /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) clean

但這失敗了,因為我在嵌入式 Linux 中找不到任何建構文件夾。而不是建構文件夾,而是一個核心文件夾,我將其替換為核心。

現在我的makefile是:

obj-m += sysfirewall.o
all:
   make -C  /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) modules
clean:
   make -C /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) clean

但是當我在目前目錄中執行 make 時,會出現以下錯誤:

$ make -C  /lib/modules/4.14.49-ti-r54/kernel -I/usr/Include/ M=/home/parsa/firewall/ modules
make[1]: Entering directory '/lib/modules/4.14.49-ti-r54/kernel'
make[1]: *** No rule to make target 'modules'.  Stop.
make[1]: Leaving directory '/lib/modules/4.14.49-ti-r54/kernel'9-ti-r54/uname -i 
Makefile:3: recipe for target 'all' failed
make: *** [all] Error 2

我怎麼解決這個問題?我應該解壓縮核心中的所有模組嗎?這真的是壓縮 Linux 核心模組的問題還是錯誤顯示了其他內容?

PS:我不想在我的筆記型電腦中交叉編譯模組。

編輯:我注意到“/lib/modules/”中應該有一個 Makefile $ (shell uname -r)/kernel" folder which is not in my embedded board. I traced the Make file in “/lib/modules/ $ (shell uname -r)/build” 文件夾並意識到它是指向 /usr/src/linux-headers-4.4.0-128/Makefile 的軟連結。但我的 /usr/ 中沒有任何內容src 在我的嵌入式板上。所以我想我必須找到一個 make 文件才能編譯這個模組,但我不知道怎麼做!

問題不在於壓縮,而在於make找不到正確的文件。注意make命令是進入/lib/modules/<kernel version>/kernel目錄,然後才報錯。所以它沒有在那裡找到它需要的任何東西。

您不能替代:它們/lib/modules/<kernel version>/kernel/lib/modules/<kernel version>/build內容不同。該kernel目錄包含該特定核心版本附帶的已編譯模組。這根本對命令沒有幫助:它需要核心原始碼附帶make的 makefile 和文件。.h其中一些是作為主核心編譯的一部分動態生成的。

通常,這/lib/modules/<kernel version>/build是一個符號連結,指向與該特定核心版本關聯的核心標頭檔所在的位置。如果您的嵌入式板使用已以“Debian 方式”編譯的核心(即make bindeb-pkg在核心源目錄中具有或類似的核心),則核心編譯過程應該產生許多.deb包:

  • linux-image-<version>_<patchversion>_<architecture>.deb= 實際編譯的核心及其模組
  • linux-headers-<version>_<patchversion>_<architecture>.deb= 你需要為這個特定核心編譯更多核心模組的標頭檔

在這種情況下,您只需要找到並安裝與linux-headers您在 ARM 板上使用的確切核心版本相對應的軟體包。它會自動/lib/modules/<kernel version>/build為您提供連結。

如果您使用傳統或類似方式編譯了自己的自定義核心make bzimage,那麼您必須/lib/modules/<kernel version>/build自己提供連結。如果實際的核心建構目錄仍然可用,只需將其連結到/lib/modules/<kernel version>/build.

引用自:https://unix.stackexchange.com/questions/453157