使用较新的编译器编译 linux 2.6 内核模块
Compile a linux 2.6 kernel module with newer compiler
我构建的嵌入式机器 运行 是 Linux 的 RT_PREMPT 版本。这是一个 Ubuntu 10.04 安装 运行 一个 Linux 2.6 内核。是的,它是一个旧内核,但我坚持了一段时间。
我编译内核的时候用的是gcc 4.4版本。在这个系统上,有一个内核模块我已经编译了三年成功了。
来自我的 Makefile...
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) \
modules
我目前的项目需要支持c++14,所以我通过从源代码构建将gcc和g++更新到5.1.0版本。我的所有 user-mode 软件都可以编译,但是当我构建内核模块的更新版本时,我立即收到以下错误:
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 吗?我 运行 倾向于更新 build-essential,但它是最新的。我的系统上有内核的源代码和 headers。我不确定我还会下载什么。
非常感谢对此问题的任何见解。提前谢谢你。
你的内核版本太旧,缺少linux/compiler-gcc5.h
。
header 包含自 linux/compiler-gcc.h,其名称由预处理器宏根据当前编译器版本生成:
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
此 header 是围绕版本 3.18
引入的。
您可以尝试从较新的内核源代码中获取此文件并将其放入 include/linux
。
打开终端并输入:
$ ls -r /usr/src/linux-headers-$(uname -r)/include/linux/ | \
grep -P "compiler-gcc\d.h" | \
head -n 1
这有望输出适合您的 linux 内核的最新 gcc 头文件。
在我的例子中是 compiler-gcc4.h
。现在您可以通过以下方式将此文件 link 复制到 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
我构建的嵌入式机器 运行 是 Linux 的 RT_PREMPT 版本。这是一个 Ubuntu 10.04 安装 运行 一个 Linux 2.6 内核。是的,它是一个旧内核,但我坚持了一段时间。
我编译内核的时候用的是gcc 4.4版本。在这个系统上,有一个内核模块我已经编译了三年成功了。
来自我的 Makefile...
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) \
modules
我目前的项目需要支持c++14,所以我通过从源代码构建将gcc和g++更新到5.1.0版本。我的所有 user-mode 软件都可以编译,但是当我构建内核模块的更新版本时,我立即收到以下错误:
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 吗?我 运行 倾向于更新 build-essential,但它是最新的。我的系统上有内核的源代码和 headers。我不确定我还会下载什么。
非常感谢对此问题的任何见解。提前谢谢你。
你的内核版本太旧,缺少linux/compiler-gcc5.h
。
header 包含自 linux/compiler-gcc.h,其名称由预处理器宏根据当前编译器版本生成:
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
此 header 是围绕版本 3.18
引入的。
您可以尝试从较新的内核源代码中获取此文件并将其放入 include/linux
。
打开终端并输入:
$ ls -r /usr/src/linux-headers-$(uname -r)/include/linux/ | \
grep -P "compiler-gcc\d.h" | \
head -n 1
这有望输出适合您的 linux 内核的最新 gcc 头文件。
在我的例子中是 compiler-gcc4.h
。现在您可以通过以下方式将此文件 link 复制到 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