我一直在尝试使用最新的源代码 linux-6.0-rc5 在我自己的机器上编译 Linux 内核。一切都很顺利,但有件事困扰着我。当我拿到Image
arch/riscv/boot 下的文件并使用file
命令查看它时,我发现它看起来像:
Image: MS-DOS executable PE32+ executable (EFI application) RISC-V 64-bit (stripped to external PDB), for MS Windows
但在我看来,它应该是data
类型的,因为objcopy -O binary -S
应该包含所有其他信息。
我已经file
整理了vmlinux
文件并得到
vmlinux: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, BuildID[sha1]=432bf8175b2c7de8404f27f5f395fdb20479f263, with debug_info, not stripped
当我重试一个具有相同类型的新构建的 C 程序时,使用objcopy
已完成的操作vmlinux
,我得到了正确的data
类型。
手动objcopy
编译vmlinux
得到的结果与PE可执行文件相同,因此系统不可能make
进行额外的更改。
vmlinux
用to get完成的事情Image
是
riscv64-linux-gnu-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux arch/linux/boot/Image
正如我们可以看到的--just-print
选项make
。
我想知道我是否误解了该行的含义objcopy
或命令的结果file
。
答案1
这是因为启动映像是 UEFI 可执行文件,其格式为便携式可执行文件(又名 Windows exe)。