我构建了运行RT_PREMPT版Linux的嵌入式计算机。这是运行Linux 2.6内核的Ubuntu 10.04安装。是的,这是一个旧内核,但我已经坚持了一段时间。
当我编译内核时,我使用了gcc 4.4版。在这个系统上,有一个我已经成功编译了三年的内核模块。
来自我的Makefile ......
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) \
modules
我当前的项目需要支持c ++ 14,所以我通过从源代码构建将gcc和g ++更新到版本5.1.0。我的所有用户模式软件都编译,但是当我去构建我的内核模块的更新版本时,我立即收到以下错误:
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-54-generic'
CC [M] /home/tbj/srcroot/ctsengine-hg/CtsRt/ctsrt_main.o
In file included from include/linux/compiler.h:40:0,
from include/linux/stddef.h:4,
from include/linux/list.h:4,
from include/linux/module.h:9,
from /home/tbj/srcroot/ctsengine-hg/CtsRt/ctsrt_main.c:31:
include/linux/compiler-gcc.h:86:30: fatal error: linux/compiler-gcc5.h: No such file or directory
简而言之:
fatal error: linux/compiler-gcc5.h: No such file or directory
如果我再次使用gcc 4.4(我把它安装在我的计算机上的另一个目录中),它会编译并运行完美。
显然,我错过了一些东西。是否无法使用比编译操作系统更新版本的编译器编译内核模块?这对我来说似乎不太可能。是否缺少配置步骤?我需要更新系统变量吗?我应该下载额外的标题吗?我运行apt来更新build-essential,但它是最新的。我的系统上有内核的源代码和头文件。我不确定还会下载什么。
非常感谢对此问题的任何见解。提前谢谢。
答案 0 :(得分:16)
您的内核版本太旧而且缺少linux/compiler-gcc5.h
。
标头包含在linux/compiler-gcc.h中,其名称由预处理器宏根据当前编译器版本生成:
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
此标头是在版本3.18
周围引入的。
您可能会尝试从较新的内核源获取此文件并将其放入include/linux
。
答案 1 :(得分:0)
打开终端并输入:
$ ls -r /usr/src/linux-headers-$(uname -r)/include/linux/ | \
grep -P "compiler-gcc\d.h" | \
head -n 1
这将有希望输出适合您的Linux内核的最新gcc标头。
就我而言,它是compiler-gcc4.h
。现在,您可以通过以下方式将此文件链接到compiler-gcc5.h
:
$ sudo ln -s /usr/src/linux-headers-$(uname -r)/include/linux/compiler-gcc4.h \
/usr/src/linux-headers-$(uname -r)/include/linux/compiler-gcc5.h