【问题标题】:LKM - can't compile module - missing headers files but header packages are installedLKM - 无法编译模块 - 缺少头文件但已安装头包
【发布时间】:2019-06-17 23:49:25
【问题描述】:

所以我一直在尝试在运行 4.15.0-43-generic 的 Ubuntu 18.04 上编译一个简单的“Hello world”LKM,并安装了 linux-headers-4.15.0-43。

这是代码:

#define MODULE
#define LINUX
#define __KERNEL__

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

int init_module(void)
{
    printk(KERN_DEBUG "Hello World!");
    return 0;
}

module_init( init_module );

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Hello world");

这是我的 Makefile:

CC      := gcc
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS  := -O2 -c $(WARN) $(INCLUDE)
SOURCES := helloworld.c
TARGET  := helloworld.ko

all:
    $(CC) $(CFLAGS) $(SOURCES) -o $(TARGET)

这些是/lib/modules/$(uname -r)/build/include的内容

acpi  asm-generic  clocksource  config  crypto  drm  dt-bindings  generated  keys  kvm  linux  math-emu  media  memory  misc  net  pcmcia  ras  rdma  scsi  soc  sound  target  trace  uapi  video  xen

我得到了一个fatal error: asm/barrier.h: No such file or directory,这是意料之中的,因为asm 目录不存在。请参阅下面的完整输出:

gcc -O2 -c -W -Wall -Wstrict-prototypes -Wmissing-prototypes -isystem /lib/modules/`uname -r`/build/include helloworld.c -o helloworld.ko
In file included from /usr/src/linux-headers-4.15.0-43/include/linux/init.h:5:0,
                 from helloworld.c:5:
/usr/src/linux-headers-4.15.0-43/include/linux/compiler.h:247:10: fatal error: asm/barrier.h: No such file or directory
 #include <asm/barrier.h>
          ^~~~~~~~~~~~~~~
compilation terminated.
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 1

对...所以我想如果我创建一个 asm-generic 到 asm 的符号链接会怎样?

sudo ln -s /lib/modules/$(uname -r)/build/include/asm-generic /lib/modules/$(uname -r)/build/include/asm

ls -ld /lib/modules/$(uname -r)/build/include/asm 确认链接存在:

lrwxrwxrwx 1 root root 56 Jan 24 19:51 /lib/modules/4.15.0-43-generic/build/include/asm -> /lib/modules/4.15.0-43-generic/build/include/asm-generic

一切都应该正常吗?不 :( 现在它抱怨找不到 asm/thread_info.h (在我完成符号链接之后)。

gcc -O2 -c -W -Wall -Wstrict-prototypes -Wmissing-prototypes -isystem /lib/modules/`uname -r`/build/include helloworld.c -o helloworld.ko
In file included from /lib/modules/4.15.0-43-generic/build/include/asm/preempt.h:5:0,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/preempt.h:81,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/spinlock.h:51,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/seqlock.h:36,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/time.h:6,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/stat.h:19,
                 from /usr/src/linux-headers-4.15.0-43/include/linux/module.h:10,
                 from helloworld.c:6:
/usr/src/linux-headers-4.15.0-43/include/linux/thread_info.h:38:10: fatal error: asm/thread_info.h: No such file or directory
#include <asm/thread_info.h>
         ^~~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 1

我从一开始就知道符号链接是个坏主意。

我还尝试包含/usr/src/linux-headers-4.15.0-43/include 而不是/lib/modules/...,但长话短说,/usr/src/linux-headers-4.15.0-43/include/ 中没有“asm”目录,并且将/usr/src/linux-headers-4.15.0-43/include/asm-generic 符号链接到/usr/src/linux-headers-4.15.0-43/include/asm 产生了与上述相同的问题。

我知道问题出在哪里,显然头文件丢失了,但问题是我找不到它们,我从哪里得到它们?软件包已安装:

$ dpkg -l | grep linux-headers-
ii  linux-headers-4.15.0-23        
ii  linux-headers-4.15.0-43        
ii  linux-headers-4.15.0-43-generic
ii  linux-headers-generic          

我尝试了所有这些,似乎都有相同的问题。

【问题讨论】:

  • 手动调整包含目录和其他内容以构建 Linux 内核模块是一个坏主意。有用于构建内核模块的KBuild 基础结构,它知道关于内核源文件、头文件等的一切。只需使用它。
  • 谢谢,我同意,就像我说的那样,我知道这是个坏主意。我对 LKM 很陌生,所以我边走边学。我对构建 LKM 非常感兴趣。
  • 那就举个LKM的例子,照着做。例如。 this one(从第一个 google 参考文献中选择)。

标签: linux ubuntu kernel


【解决方案1】:

好的,感谢 Tsyvarev 的进一步阅读,我发现了问题:)

问题的主要原因是我的 Makefile,以下确实对我有用:

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

这解决了我原来遇到的问题,弹出了一个与此线程无关的新问题,但都已修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2021-08-26
    相关资源
    最近更新 更多