5

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

谢谢,

Vj

4

3 回答 3

4

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

$ file vmlinux

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

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

快乐黑客!

于 2013-07-13T17:27:35.540 回答
2

Linux内核构建时,会生成两个镜像vmlinux和vmlinux.o。

vmlinux.o : 是可重定位的目标文件

vmlinux:是可执行文件

链接器采用可重定位目标文件和命令行参数来生成可执行目标文件。要生成可执行文件,链接器必须执行符号解析和重定位。

在 vmlinux.o 和 vmlinux 上执行 'file' 和 'readelf' 命令以获取更多信息。

root@beaglebone:/home# 文件 vmlinux

vmlinux:ELF 32 位 LSB 可执行文件,ARM,版本 1 (SYSV),静态链接,BuildID[sha1]=0xdfd102a3c2b79fcc2f1949323dc54b9371c75608,未剥离

根@beaglebone:/home#

root@beaglebone:/home# 文件 vmlinux.o

vmlinux.o:ELF 32 位 LSB 可重定位,ARM,版本 1 (SYSV),未剥离

于 2015-10-01T16:39:58.233 回答
0

请尝试以下操作以了解它们是什么。
文件 vmlinux
文件 vmlinux.o

检查您的 make 文件以了解 vmlinux 是如何准备的。这将带来一些启示。
如果使用vmlinux.o来准备vmlinux,则不需要vmlinux的大小必须大于vmlinux.o

于 2013-08-15T06:36:52.743 回答