当我构建Linux内核时,会生成两个映像vmlinux和vmlinux.o。它们的大小似乎也各不相同(分别为113KB和198KB)。有人可以提供有关差异的见解吗?
谢谢,
VJ
答案 0 :(得分:4)
Linux构建期间生成的图像因架构和目标而异。除了问题中提到的那两个之外,还有许多中间构建目标。除了可能用于学术目的之外,大多数都是无趣的。不幸的是,有一个名为vmlinux的目标。 vmlinux.o不是很有趣。在顶级Linux树中,您将找到一个名为vmlinux的ELF文件。执行
$ file vmlinux
应确认这是ELF文件。我不知道任何直接启动此文件的系统。该文件唯一有趣的是调试,因为它包含调试器可以读取的调试符号。实际的引导目标将在子目录中找到,具体取决于体系结构。对于x86,(认为这不是我的专业知识)我认为你会找到一个名为bzImage的目标。对于ARM体系结构,某些系统启动zImage,其他系统启动uImage(这是一个打包在U-Boot引导程序识别的标头中的Linux内核映像。即使您删除了U-Boot标头,图像也是合成图像。这是它不是一个ELF文件,它不是纯粹的.o等。它是几个二进制blob的串联,它可以包括内核配置信息,内核本身,几乎总是被压缩,并且通常是一段可运行的代码(即我称之为“bootstrap”加载器,它通常包含机器和电路板特定的初始化例程。我对x86不熟悉,但即使在该架构上,内核启动映像(你引导的映像)也是如此。包含多个组件的合成图像,即不是纯.o或ELF文件。
查看正在发生的事情的一个好方法是使用详细模式编译内核,然后观察最后的步骤以查看图像的操作方式。将“V = 1”添加到“make”命令行以打开详细模式。
快乐的黑客攻击!
答案 1 :(得分:1)
构建Linux内核时,会生成两个映像vmlinux和vmlinux.o。
vmlinux.o:是可重定位目标文件
vmlinux:是可执行文件
Linker获取可重定位目标文件和命令行参数,以生成可执行目标文件。要生成可执行文件,链接器必须执行符号解析和重定位。
在vmlinux.o和vmlinux上执行'file'和'readelf'命令以获取更多信息。
root @ beaglebone:/ home#file vmlinux
vmlinux:ELF 32位LSB可执行文件,ARM,版本1(SYSV),静态链接,BuildID [sha1] = 0xdfd102a3c2b79fcc2f1949323dc54b9371c75608,未剥离
根@ beaglebone:/家庭#
root @ beaglebone:/ home #file vmlinux.o
vmlinux.o:ELF 32位LSB可重定位,ARM,版本1(SYSV),未剥离
答案 2 :(得分:0)
尝试以下方法,了解它们的含义
文件vmlinux
file vmlinux.o
检查您的make文件以了解如何准备vmlinux。这将有所启发 没有必要使用vmlinux.o来准备vmlinux,vmlinux的大小必须大于vmlinux.o