【问题标题】:how to Build external kernel module without kernel source tree如何在没有内核源代码树的情况下构建外部内核模块
【发布时间】:2017-05-31 08:39:16
【问题描述】:

我有一个编译内核模块和用户空间应用程序的第 3 方软件包。不幸的是,这个第 3 方非常复杂,并且不使用 Kbuild 来构建内核模块(我尝试过但没有成功)。

我尝试使用以下行构建一个简单的驱动程序:

    arm-linux-gnueabihf-gcc  -D__KERNEL__ -Wall -include /lib/modules/4.4.62-18.6-default/build/include/generated/autoconf.h -MD -MP   -Werror -O2 -I /usr/src/linux-4.4.62-18.6/include -I /src/include -DMODULE -c -o hello_dkm.o hello_dkm.c  
    $(LD) -o $(debug_target) $(LD_COMMON_FLAGS) -g $(debug_Objs)

我有:

fatal error: /usr/src/linux-4.4.62-18.6/include/linux/thread_info.h:54:29: fatal error: asm/thread_info.h: No such file or directory

附录

  • 平台:Altera Cyclone V SoC,ARM cortex A9 双核
  • 内核:linux Altera 3.7.0
  • 主机:Linux openSuse 42

PS:在我团队的项目平台中,使用内核源代码树的经典编译线很难使用: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

提前致谢,

【问题讨论】:

  • 我认为c++ 标签不适用于这个问题。
  • 对于编译内核模块,您需要内核构建目录中的一些文件(即构建内核后的源目录),即使您不使用kbuild 来满足您的目的.您需要配置选项,因为它们被 Linux 头文件(作为宏)使用。您需要来自Module.symvers 文件的内核核心符号版本。在没有 kbuild 的情况下描述整个构建过程对于 Stack Overflow 来说似乎过于宽泛

标签: c linux makefile linux-kernel


【解决方案1】:

您的直接问题是“asm/thread_info.h”不在您的CPATH 中,也没有在您的任何-I 参数中指定。您需要在系统上找到该文件并将其根放入CPATH 环境变量或-I 指令中。

为了明确这一点,如果您在/usr/local/include/linux/asm/thread_info.h 找到文件,则必须在arm-linux-gnueabihf-gcc 前面加上CPATH=/usr/local/include/linux,或者在命令行中的某处插入-I /usr/local/include/linux,可能就在arm-linux-gnueabihf-gcc 之后。

可能还有其他问题,但这应该会让您进入下一步。

【讨论】:

    【解决方案2】:

    您可以使用(.ko 文件)生成内核模块,例如,

    创建名为“Makefile”的 Makefile,然后将这段代码写入其中;

    obj-m += drivername.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
    

    然后打开终端,将make命令写入驱动所在目录。这将生成驱动程序的 .o 和 .ko 文件。

    用插入驱动写insmod 驱动程序将被加载到您的内核中。

    如果我没理解错,对你有帮助

    【讨论】:

    • 虽然这需要 kbuild,并且 OP 表示他的构建环境中没有可用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多