我刚刚开始编写内核模块。我指的是本指南。
我完全按照指南中所述编写了一个简单的 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
我查阅了该论坛和其他论坛,发现了以下内容
- 有人试图构建 Linux 内核,但失败了。这里
- 这让我此补丁。但我不知道如何使用它。
- 然后我尝试使用 gcc-5(只是想看看会发生什么。它仍然不起作用。
- 我基本上完成了所有步骤这家伙。我尝试添加
-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 的全新安装,就无法升级到最新的软件包?
无论如何,仍然想知道更多...