时间:2016-08-29 18:35:52

标签: c linux gcc linux-kernel

最近我升级到 Ubuntu 16.04.1 Xenial (来自 14.04 Trusty )构建主机,我为此编译了不同的Linux内核自己的项目。 Ubuntu 16.04.1 意味着使用新的更新环境来构建二进制文件。这些工具包括一个新的gcc-5.4 libc6 (用于用户空间应用程序)等。另外一个新的Ubuntu提供(或建议)一个包含新make的新内核包-kpkg脚本并用它来提取不同的依赖关系,如 build-essential binutils

好的,我的任务是编译linux内核v3.10.12 或v3.19 )并在VirtualBox机器中运行它(体系结构x86_64,系统Ubuntu 16.04.1 )。我过去能够在构建服务器上使用编译器gcc-4.8部署的Ubuntu 14.04 Trusty中编译kernel-v3.10.12和kernel-v3.19,并在我上面提到的VirtualBox机器下启动内核,但现在在启动内核编译时出现问题

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

为了构建内核,我使用了Ubuntu aptitude' kernel-package'提供的make-kpkg' 脚本。 我使用gcc-4.8 为x86_64构建内核,就像我一直在做的那样

一次' make-kpkg'已经编译了内核并收集了linux-headers,它开始将它们打包到deb-packages中,这使得我能够执行' dpkg -i'在他们的系统中,并将他们安装在一个'debian'方式

哦,假设我做到了。然后我将重启系统

当我在grub菜单中选择我的编译内核时,它会在屏幕上写入" 加载linux内核...加载初始ramdisk " ,然后题字消失,屏幕变黑,我只看到一个以下划线形式的光标" _"屏幕左上角的标志。这就是全部。什么都不会发生。启动过程似乎已经停滞

我尝试交换make-kpkg为旧的(来自Trusty),交换编译器gcc-4.8.5为gcc-4.9,gcc-4.7,甚至gcc-5.2在目录include / linux中做了几个补充/对于gcc-5.2的支持,但没有任何结果,结果仍然是相同的

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

实际上,我发现的是,这笔交易是在内核中,而不是在initrd中,因为我设法用“#”破坏了#&;内核由工作人员离开' initrd'与“破碎”一起构建内核和调试日志记录开始出现,内核正在加载,直到rootfs出来安装,此时内核没有设法加载它并离开initramfs模式

有人遇到我正在观察的同一问题吗?实际上,我几乎已经筋疲力尽了几天一直在努力解决这个问题 也许有人有任何食谱或建议如何摆脱这个问题?

我甚至把恐慌'函数代码完全在函数的第一行" asmlinkage void __init start_kernel(void)"但什么都没发生,仍然是同样的黑屏

问题可能与gcc编译内核时使用的新glibc有关吗?就个人而言,我不容易这么想,但在Linux的世界里,一切都会发生。另一方面也许工具链(ld,as)以某种方式影响了?我很乐意请求帮助。

我几乎可以肯定,在我之前的某个人已经遇到过这样的问题,我会一直在寻找一个类似的主题,但没有找到类似的东西

提前谢谢

2 个答案:

答案 0 :(得分:1)

简答

这是 glibc 内核版本不匹配,如果您需要,可以创建 glibc 包,使其支持您需要的内核版本,方法是使用{{ 1}}在配置时标记。

长答案

你的 glibc 很可能是以 工作到某个版本的linux的方式编译的。这是在配置阶段的--enable-kernel标志的帮助下完成的。任何早于--enable-kernel中指定版本的版本都将被 glibc 拒绝,因此不会加载任何程序,例如初始化程序可能是 systemd 初始化。

这来自configuration help of glibc

  

--enable-kernel

     

此选项目前仅供参考   在GNU / Linux系统上很有用。 version参数的格式应为X.Y.Z,并描述了生成的库应支持的最小版本的Linux内核。版本号越高,添加的兼容性代码越少,代码获得的速度就越快。

答案 1 :(得分:0)

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

实际上我所做的是在主机系统上使用旧的glibc-2.19编译了一个旧的gcc-4.8.5,在那里我构建了旧版本的内核

使用选项--enable-kernel = 3.10.12编译Glibc-2.19,并使用旧版本的linux-3.10.12 标题编译。 编译器结果就像一个交叉编译器'使用glibc-2.19 。因此,我使用版本3.10.12构建了一个旧内核,使用了这个'交叉编译器',它使用了glibc-2.19,并且一切都已经开始正常工作

感谢您的帮助,并指导我以正确的方式解决问题,但我不得不注意到这笔交易是在主机系统的glibc中使用的,但不是在我使用的目标系统glibc中假设说(但也许我误解了@iharob)