簡體   English   中英

如何在交叉編譯內核模塊的 Makefile 中提供 -C 選項?

[英]How to provide -C option in the Makefile for cross-compiling kernel module?

我正在嘗試從我的 x86_64 機器為 arm64 機器構建一個簡單的內核模塊。 目標和主機都使用 ubuntu 20.04 作為操作系統。 首先,我嘗試使用此 Makefile 為主機 (x86_64) 構建一個簡單的內核模塊。 順便說一句, uname -r在我的情況下給出了 5.4.0-77-generic 。

obj-m += chr_drv_ex1.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

該程序構建並運行正常。

現在我想為 arm64 ubuntu 20.04 機器目標(我有一個虛擬機)嘗試一下。 一種想法是從 arm64 機器復制 /lib/modules/5.4.0-77-generic/build 目錄,並將該文件夾用作交叉編譯的 -C 選項。 但我很快發現這個'build'目錄是指向/usr/src/linux-headers-5.4.0-77-generic的符號鏈接,許多文件或目錄也有指向/usr/src/linux-下的符號鏈接headers-5.4.0-77。 所以我需要復制 /lib/modules/5.4.0-77-generic、/usr/src/linux-headers-5.4.0-77 和 /usr/src/linx-headers-5.4.0-77-generic . 而且這看起來不太好。

所以我的問題是:在這種情況下,我應該如何提供 -C 選項(構建腳本所在的位置)? 我可以在我的主機系統中安裝 linux-headers-5.4.0-77 和 linux-headers-5.4.0-77-generic 並使用它們嗎? (我試過了,但我有這個編譯錯誤:

make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -C /lib/modules/5.4.0-77-generic/build M=/home/ckim/pprj/qemu_test/test_ldd modules
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-77-generic'
  CC [M]  /home/ckim/pprj/qemu_test/test_ldd/chr_drv_ex1.o
In file included from ./include/linux/types.h:6,
                 from ./include/linux/limits.h:6,
                 from ./include/linux/kernel.h:7,
                 from /home/ckim/pprj/qemu_test/test_ldd/chr_drv_ex1.c:1:
./include/uapi/linux/types.h:5:10: fatal error: asm/types.h: No such file or directory
    5 | #include <asm/types.h>
      |          ^~~~~~~~~~~~~
compilation terminated.
make[2]: *** [scripts/Makefile.build:271: /home/ckim/pprj/qemu_test/test_ldd/chr_drv_ex1.o] Error 1
make[1]: *** [Makefile:1762: /home/ckim/pprj/qemu_test/test_ldd] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-77-generic'
make: *** [Makefile:4: all] Error 2

@Tsyvarev在他的評論中告訴我,我應該實際構建內核,並且-C選項應該指向內核構建目錄。 所以這就是我做的更多搜索。 (感謝@Tsyvarev !)

假設您位於擁有內核模塊*.c源程序(此處為chr_drv_ex1.c )和Makefile 的目錄中,並且我已從我的虛擬機復制 /boot/config-5.4.0-77-generic m 為./u20_config制作內核模塊。 要獲取當前運行的內核的.config文件,請參見此處

sudo apt install linux-source-5.4.0 (/usr/src/linux-source-5.4.0 is installed)
tar -xf /usr/src/linux-source-5.4.0/linux-source-5.4.0.tar.bz2
cd linux-source-5.4.0
cp ../u20_config .config (u20_config is from ubuntu-20.04 VM)
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j`nproc`

cd ..
make (this builds kernel module and app, see Makefile)

這是我使用的Makefile (test_chr_drv 是使用驅動程序的應用程序)。

export CROSS_COMPILE:=aarch64-none-linux-gnu-
export ARCH:=arm64
obj-m += chr_drv_ex1.o
export KDIR:=linux-source-5.4.0

all: test_chr_drv
    make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) modules

clean:
    make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) clean
    rm -f test_chr_drv

test_chr_drv: test_chr_drv.c
    $(CROSS_COMPILE)gcc $^ -o $@

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM