不确定这里发生了什么。我正在尝试将 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
”应该已经在我的计算机上了吗?还是在内核压缩包中?
我从 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 源代码树中的相应目录确实不是没有任何.o
文件.ko
。显然,4.14.x 中启用了一个配置项,而我在 4.9.x 中没有启用它。
我尝试将 4.14.x 配置得尽可能接近我的工作 4.9.x;我知道一些新的选项,但通常我会尝试保持中间内核版本之间的配置相同。
话虽如此,我不知道哪个配置选项会想要看到头文件linux-4.14.*/tools/objtool/arch/x86/
......有任何想法吗?
答案1
我正在测试 Phoronix build-linux-kernel。遇到了同样的缺失<gelf.h>
问题。
sudo apt install libelf-dev
问题解决了。
答案2
我在升级 Slackware 14.1 中的内核时遇到了非常类似的问题,基本上是相同的错误。我对内核业务很陌生,但我相信安装 libelf 库可以解决此问题。它记录在这里:
https://directory.fsf.org/wiki/Libelf
此外,我相信这个问题应该由默认的 make 行为来捕获,但事实并非如此。在这一点上我可能完全错了,但这里有一个与 make 相关的补丁,而 Slackware 14.1 没有这个补丁: