首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux内核3.*系列在Ubuntu 16.04.1中通过make-kpkg和gcc-4.8.5自定义编译后将无法正确启动。

Linux内核3.*系列在Ubuntu 16.04.1中通过make-kpkg和gcc-4.8.5自定义编译后将无法正确启动。
EN

Stack Overflow用户
提问于 2016-08-29 18:35:52
回答 2查看 660关注 0票数 1

最近,我升级到了Ubuntu16.04.1 Xenial (来自14.04可靠的),这是一个构建主机,到目前为止,我已经为自己的项目编译了不同的linux内核。Ubuntu16.04.1意味着使用一个新的更新环境来构建二进制文件。这些工具包括a新的gcc-5.4libc6 (用于用户空间应用程序)等。还有一个新的Ubuntu提供(或建议)一个新内核包,其中包含一个新的make-kpkg脚本,并使用它来提取不同的依赖项,比如构建必需的、二进制的等等。

好的,我的任务是编译一个Linux内核v3.10.12 (或v3.19),并在VirtualBox机器(architecture x86_64,SystemUbuntu16.04.1)中运行它。我以前能够编译内核--v3.10.12和内核--v3.19,在Ubuntu14.04中使用编译器gcc-4.8可靠地部署在构建服务器上,并在我前面提到的VirtualBox机器下启动内核,但是现在启动编译的内核时出错了。

例如,让我们考虑编译和运行v3.10.12

为了构建内核,我使用了由Ubuntu的包“内核-包”提供的“make”脚本。我像往常一样使用gcc-4.8为x86_64构建内核

一旦'make-kpkg‘编译了内核并收集了linux头,它就开始将它们打包到deb包中,这使我能够在系统中对它们执行'dpkg -i’,并以'debian‘的方式安装它们。

好吧,假设是我干的。然后我将重新启动系统。

当我在grub菜单中选择编译好的内核时,它会在屏幕上写“ form linux内核.加载初始的ramdisk",然后铭文消失,屏幕上的屏幕变黑,在屏幕的左上角只看到一个下划线"_”符号的光标。就这样。不会再有什么事发生了。引导过程似乎已经卡住了。

我试着把make-kpkg换成一个旧的(来自信任的),把编译器gcc-4.8.5替换成gcc-4.9,z-4.7,甚至-5.2,在目录include/linux/中做了几个补充,以获得from 5.2的支持,但是没有什么结果,的结果仍然是相同的

我尝试了相同的操作(在相同的Ubuntu16.04.1和工具链上),使用新的内核4.系列*(例如,4.6),意思是构建内核,将它们打包到*.deb包中,安装到VirtualBox机器中,重新启动系统,和一切正常运行,我在屏幕上看到调试消息,就像我一直看到的一样。我试着使用gcc-4.7,gcc-4.8,劈叉-4.9,and-5.4,一切正常工作,我能够适当和完整地加载linux-内核-v4.6。但是,当我构建3.10.12 (或3.19)内核时,我无法正确引导它们,也无法弄清楚为什么会发生这种情况。

实际上,我发现交易在内核中,而不是initrd中,因为我设法用一个工作的'initrd‘替换了’initrd‘,这个’initrd‘与’坏的‘内核一起构建,并且调试日志开始出现,内核一直在加载,直到rootfs被挂载,这时内核无法加载它,并以initramfs模式离开。

有人遇到过我所观察到的同样的问题吗?实际上,我已经疲惫不堪了,几天来一直在为这个问题挣扎,也许有人有什么办法或建议来解决这个问题?

我甚至在函数的第一行"asmlinkage void __init start_kernel(void)“中添加了‘恐慌’函数代码,但是没有发生任何事情,仍然是相同的黑色屏幕。

这个问题是否与gcc编译我的内核时使用的一种新的灵巧语言有关?就我个人而言,我并不倾向于这样认为,但在linux的世界里,一切都可能发生。另一方面,也许工具链(ld,因为某种原因)已经影响了?我恳请为我提供帮助。

我几乎确信,在我之前的人已经遇到过这样的问题,我会一直在寻找一个类似的话题,但没有发现任何类似的东西。

提前谢谢你

EN

回答 2

Stack Overflow用户

发布于 2016-08-29 18:41:30

短答案

这是一个glibc内核版本错配,如果您需要它,您可以创建glibc包,以便它支持所需的内核版本,方法是在配置时使用--enable-kernel标志。

长答案

您的glibc很可能是以这样一种方式编译的,即它只能工作到linux的某个版本。这是在配置阶段借助--enable-kernel标志完成的。任何比--enable-kernel中指定的版本更早的版本都会被glibc拒绝,因此不会加载任何程序,比如init程序,大概是systemd的init。

这是来自configuration help of

--enable-kernel=version 这一方案目前仅适用于GNU/Linux系统。version参数应该具有X.Y.Z表单,并描述生成库所支持的Linux内核的最小版本。版本号越高,添加的兼容性代码就越少,代码获得的速度也就越快。

票数 1
EN

Stack Overflow用户

发布于 2016-08-30 17:59:28

最后,我成功地解决了这个问题。

实际上,我所做的是在主机系统上编译了一个旧的gcc-4.8.5和一个旧的glibc-2.19,在这个系统中我构建了老版本的内核

Glibc-2.19是用一个选项--启用内核=3.10.12和旧版本Linux3.10.12的头编译的。编译器被证明是一个使用glibc-2.19的“交叉编译器”。因此,我用这个“交叉编译器”构建了一个带有3.10.12版本的旧内核,它使用glibc-2.19,everything已经开始以适当的方式工作了,

感谢您的帮助,并指导我找到解决问题的正确方法,但我不得不注意到,这笔交易是在主机系统的glibc中使用的,而不是在目标系统glibc中使用的,就像我刚才所说的那样(但也许我误解了@iharob)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39212920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档