使用新的 gcc 编译旧内核

使用新的 gcc 编译旧内核

我正在尝试在我的 Linux 机器上使用当前的 gcc-6.3 编译旧版本的 Linux (3.4)。但运行 make 命令会显示如下错误:

scripts/kconfig/conf.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC

而且我还没有找到任何解决方案。看来 gcc 需要对某些对象使用 fPIC 标志,而 3.4 内核配置文件并未要求如此。最好我不想触及内核默认值。我应该如何要求 gcc 停止需要此标志或禁用它?

答案1

我的猜测是,您使用的 gcc 版本已修改为默认生成 PIE(位置无关可执行文件)。根据这个至少Ubuntu已经做了这个转变。该目录中的代码scripts/kconfig用于未链接到内核的辅助程序,并且(据我所知)不链接到外部静态库。因此默认值是什么并不重要,除非您有一些上次运行具有不同默认值的编译器版本的剩余内容。运行make clean并重新编译。

如果这没有帮助,请查看生成文件对于当前内核,这会强制-no-pie.

答案2

无论我解决了什么错误,下一次编译尝试中都会出现新的错误。不幸的是,我发现的最好的解决方案是使用旧的 gcc 来编译这个内核。

相关内容