首页 > 解决方案 > 无法交叉编译简单的内核模块

问题描述

我正在尝试按照“Hello World”进行编译。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("BOBR");
MODULE_DESCRIPTION("HELLO MODULE");
MODULE_VERSION("0.10");

static char *name = "user";
module_param(name, charp, S_IRUGO);
MODULE_PARM_DESC(name, "The name to display");

static int __init hello_init(void) {
    printk(KERN_INFO "HEllo, %s!\n", name);
    return 0;
}
static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye, %s !\n", name);
}

module_init(hello_init);
module_exit(hello_exit);

我的 Makefile 是

ifneq ($(KERNELRELEASE),)
include Kbuild
#KDIR ?= ../repos/linux 
else
    KDIR ?= /lib/modules/4.9.0-6-amd64/build

default:
    $(MAKE) -C $(KDIR) M=$$PWD

clean:
    $(MAKE) -C $(KDIR) M=$$PWD clean

endif

我开始制作:make ARCH=arm CROSS_COMPILE='ccache arm-eabi-' PATH=/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-eabi/bin:$PATH

我在 Debian 4.9.0-6-amd64 上编译。目标是 arm32 4.16.18。问题是我为我的主机获得了一个模块(我可以对其进行安装),但目标内核将其作为无效模块拒绝。

当我尝试将 Makefile 中的 linux 路径更改为目标内核源时,编译失败并显示fatal error: asm/barrier.h: No such file or directory.

标签: linux-kernel

解决方案


推荐阅读