如何解决如何在交叉编译内核模块的 Makefile 中提供 -C 选项?
我正在尝试从我的 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 到 ./u20_config。要获取当前运行的内核的 .config 文件,请参阅 here。
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 $@
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。