编译Linux内核版本4.14.51时出错

编译Linux内核版本4.14.51时出错

不知道这里发生了什么。我正在尝试将 Linux 内核从 4.9.x 升级到 4.14.x,发生了以下情况:

In file included from arch/x86/decode.c:26:0:
arch/x86/../../elf.h:22:18: fatal error: gelf.h: No such file or directory
 #include <gelf.h>
                  ^
compilation terminated.
mv: cannot stat ‘/usr/src/linux-4.14.51/tools/objtool/arch/x86/.decode.o.tmp’: No such file or directory
make[4]: *** [/usr/src/linux-4.14.51/tools/objtool/arch/x86/decode.o] Error 1
make[3]: *** [arch/x86] Error 2
make[2]: *** [/usr/src/linux-4.14.51/tools/objtool/objtool-in.o] Error 2
make[1]: *** [objtool] Error 2
make: *** [tools/objtool] Error 2

有什么想法这里发生了什么(除了明显的)? “ gelf.h”应该已经在我的计算机上了吗?或者在内核 tarball 中?

我从 kernel.org 下载了 vanilla 4.14.51 - 14 年来我已经成功地、反复地编译了我自己的(未修改的)vanilla 内核,但这是新的。

我的电脑是一台配备 Core2 i5(64 位)和 Slackware 14.1 的戴尔笔记本电脑 - 几年前我将库存 3.17.x 升级到 4.4.x,最近又升级到 4.9.x(当前为 4.9.109)。

已安装 libelf:

me@mylaptop:~$ locate gelf.h
/usr/include/libelf/gelf.h

me@mylaptop:~$ ls /var/log/packages/*elf*
/var/log/packages/libelf-0.8.13-x86_64-2

附录

昨晚尝试 4.14.55 时,我注意到内核构建脚本期望看到“gelf.h”的目录位于内核源代码树中,而不是常规的/usr/include.

话虽这么说,我的(正在运行的)4.9.x 源代码树中的相应目录确实不是有任何.onor.ko文件。显然,4.14.x 中启用了一个配置项,但我在 4.9.x 中没有启用。

我尝试将 4.14.x 配置为尽可能接近我的工作 4.9.x;我知道一些新选项,但通常我会尝试在中间内核版本之间保持配置相同。

话虽这么说,我不知道哪个配置选项希望在linux-4.14.*/tools/objtool/arch/x86/...中查看头文件有任何想法吗?

答案1

您需要安装以下软件包:

libelf

它提供gelf.h头文件和其他文件。也许您只是从未将其安装在您的计算机上。

答案2

上面#include是寻找文件正好在 /usr/include/而您的文件位于其他位置,在/usr/include/libelf/.这行不通。

任何一个:

  • 创建一个符号链接(最好),sudo ln -s libelf/gelf.h /usr/include/gelf.h
  • 复制文件,例如sudo cp -a /usr/include/libelf/gelf.h /usr/include
  • 修复包含,例如#include <libelf/gelf.h>

无论如何,这是 Slackware 中的打包问题。该包含文件安装不正确。

相关内容