vmlinux和vmlinux.o之间的区别

The*_*ker 5 kernel linux-kernel embedded-linux

当我构建Linux内核时,会生成两个映像vmlinux和vmlinux.o.它们的大小似乎也各不相同(分别为113KB和198KB).有人可以提供有关差异的见解吗?

谢谢,

VJ

cha*_*nan 5

Linux 构建期间生成的映像因体系结构和目标而异。除了问题中提到的两个之外,还有许多中间构建目标。除了可能用于学术目的之外,大多数都是无趣的。不幸的是,名为 vmlinux 的目标不只一个。vmlinux.o 不是很有趣。在 Linux 树的顶层,您会发现一个名为 vmlinux.elf 的 ELF 文件。执行中

$ file vmlinux
Run Code Online (Sandbox Code Playgroud)

应该确认这是 ELF 文件。我不知道有任何系统可以直接启动该文件。该文件唯一有趣的地方是用于调试,因为它包含调试器可以读取的调试符号。实际的引导目标将在子目录中找到,具体取决于体系结构。对于 x86,(认为这不是我的专业知识)我想你会找到一个名为 bzImage 的目标。对于 ARM 架构,一些系统启动 zImage,另一些系统启动 uImage(这是一个打包在 U-Boot 引导加载程序可识别的标头中的 Linux 内核映像。即使删除 U-Boot 标头,该映像也是一个复合映像。即,它不是一个 ELF 文件,也不是一个纯 .o 等。它是几个二进制 blob 的串联,其中可以包括内核配置信息、内核本身,几乎总是压缩的,并且通常是一段可运行的代码(即. 未压缩),我称之为“引导”加载程序,它通常包含特定于机器和主板的初始化例程。我对 x86 不太熟悉,但即使在该体系结构上,内核引导映像(您引导的那个)也是包含多个组件的合成图像,即不是纯 .o 或 ELF 文件。

查看正在发生的情况的一种好方法是使用详细模式编译内核,然后观看最后的步骤以了解如何操作图像。将 V=1 添加到“make”命令行以打开详细模式。

快乐黑客!