首页 文章

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

提问于
浏览
15

我构建了运行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(我把它安装在我的计算机上的不同目录中),它会编译并运行完美 .

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

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

2 回答

  • 16

    打开终端并输入:

    $ 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
    
  • 0

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

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

    #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
    

    此标头是在版本 3.18 周围引入的 .

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

相关问题