无法构建简单的 Hello World 内核模块

无法构建简单的 Hello World 内核模块

我刚刚开始编写内核模块。我指的是本指南

我完全按照指南中所述编写了一个简单的 Hello world 程序。

#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */

int init_module(void)
{
    printk(KERN_INFO "Hello world 1.\n");

    /* 
     * A non 0 return means init_module failed; module can't be loaded. 
     */
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}

我尝试使用以下 makefile 来编译它:

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

我收到错误:

error: code model kernel does not support PIC mode

我查阅了该论坛和其他论坛,发现了以下内容

  1. 有人试图构建 Linux 内核,但失败了。这里
  2. 这让我此补丁。但我不知道如何使用它。
  3. 然后我尝试使用 gcc-5(只是想看看会发生什么。它仍然不起作用。
  4. 我基本上完成了所有步骤这家伙。我尝试添加-fno-pie,然后该人遵循其他步骤。

$ uname -a
Linux cristopher 4.15.0-43-generic #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

根据错误链接,这个问题已在 中得到修复gcc。但我认为在我使用的稳定版本中还没有这个问题。

我能想到多种解决该问题的方法。1. 安装上面 (2) 中的补丁。2. 使用gcc不存在该问题的旧版本。3. 在内核 makefile 中使用更多额外标志。(不过我不确定这一点。)


我不知道如何做上述任何事情。如能得到任何帮助我将不胜感激。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

附言:我最近从 16.04 升级到了 18.04。之前它运行良好。


包括的完整输出make all

$ make all
make -C /lib/modules/4.15.0-43-generic/build M=/media/parth/F/Parth/programs/dev modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-43-generic'
  CC [M]  /media/parth/F/Parth/programs/dev/hello-1.o
/media/parth/F/Parth/programs/dev/hello-1.c:1:0: error: code model kernel does not support PIC mode
 #include <linux/module.h> /* Needed by all modules */
 ^
scripts/Makefile.build:339: recipe for target '/media/parth/F/Parth/programs/dev/hello-1.o' failed
make[2]: *** [/media/parth/F/Parth/programs/dev/hello-1.o] Error 1
Makefile:1551: recipe for target '_module_/media/parth/F/Parth/programs/dev' failed
make[1]: *** [_module_/media/parth/F/Parth/programs/dev] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-43-generic'
Makefile:7: recipe for target 'all' failed
make: *** [all] Error 2

好吧,我不太清楚是怎么回事,也不知道为什么,但原来的错误不再出现了。但出现了一个新的错误:

In file included from ./include/linux/list.h:5:0,
                 from ./include/linux/module.h:9,
                 from /media/parth/F/Parth/programs/dev/hello-1.c:1:
./include/linux/types.h:17:9: error: unknown type name ‘__kernel_ino_t’
 typedef __kernel_ino_t  ino_t;
         ^~~~~~~~~~~~~~
./include/linux/types.h:18:9: error: unknown type name ‘__kernel_mode_t’
 typedef __kernel_mode_t  mode_t;
         ^~~~~~~~~~~~~~~
./include/linux/types.h:21:9: error: unknown type name ‘__kernel_off_t’
 typedef __kernel_off_t  off_t;
         ^~~~~~~~~~~~~~

等等,等等,等等......

一切似乎都源于此:

In file included from ./include/linux/list.h:9:0,
                 from ./include/linux/module.h:9,
                 from /media/parth/F/Parth/programs/dev/hello-1.c:1:
./include/linux/kernel.h:6:10: fatal error: stdarg.h: No such file or directory
 #include <stdarg.h>
          ^~~~~~~~~~

-fno-pie我尝试从系统中以下几行(大约第 650 行)的内核构建 makefile 中删除。并得到了原始错误消息。

KBUILD_CFLAGS   += $(call cc-option,-fno-PIE)
KBUILD_AFLAGS   += $(call cc-option,-fno-PIE)

好的,我更新了我的系统,在发布文件后, 和链接已生效。看来他们已经修复了错误。或者,是否有条款规定,一旦您执行 UBUNTU 的全新安装,就无法升级到最新的软件包?

无论如何,仍然想知道更多...

相关内容