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

use*_*576 17 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
Run Code Online (Sandbox Code Playgroud)

我当前的项目需要支持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
Run Code Online (Sandbox Code Playgroud)

简而言之:

fatal error: linux/compiler-gcc5.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如果我再次使用gcc 4.4(我把它安装在我的计算机上的不同目录中),它会编译并运行完美.

显然,我错过了一些东西.是否无法使用比编译操作系统更新版本的编译器编译内核模块?这对我来说似乎不太可能.是否缺少配置步骤?我需要更新系统变量吗?我应该下载额外的标题吗?我运行apt来更新build-essential,但它是最新的.我的系统上有内核的源代码和头文件.我不确定我还能下载什么.

非常感谢对此问题的任何见解.先感谢您.

baf*_*baf 18

你的内核版本太旧而且缺少linux/compiler-gcc5.h.

头文件包含在linux/compiler-gcc.h中,其名称由预处理器宏根据当前编译器版本生成:

#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
Run Code Online (Sandbox Code Playgroud)

这个标题是围绕版本引入的3.18.

您可能会尝试从较新的内核源获取此文件并将其放入include/linux.

  • @abligh你是对的.或者`echo"#include <linux/compiler-gcc4.h>"> include/linux/compiler-gcc5.h`. (11认同)
  • Upvoted,但我猜测将compiler-gcc4.h复制到compiler-gcc5.h中也值得一试. (3认同)