不知道这里发生了什么。我正在尝试将 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 源代码树中的相应目录确实不是有任何.o
nor.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 中的打包问题。该包含文件安装不正确。