使用较新的编译器编译linux 2.6内核模块

时间:2015-04-28 16:58:13

标签: c gcc linux-kernel

我构建了运行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,但它是最新的。我的系统上有内核的源代码和头文件。我不确定还会下载什么。

非常感谢对此问题的任何见解。提前谢谢。

2 个答案:

答案 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