【问题标题】:Compiling the Linux kernel as non-ELF将 Linux 内核编译为非 ELF
【发布时间】:2011-07-04 13:49:33
【问题描述】:

最近一些发行版开始将 vmlinuz 文件与 initrd 一起打包到“ELF-Boot”中,这可以说具有一些优势。好吧,我需要使用 vmlinuz 文件的旧格式编译一个新内核。有谁知道我怎样才能做到这一点?我使用的是 Oracle Enterprise Linux,如果我运行例如“make bzImage”,结果是一个我无法使用的 ELF 文件。

或者,有没有办法解压 ELF-Boot 映像并提取常规的 vmlinuz 文件?

澄清一下,当我执行“文件 /boot/vmlinuz”时,我现在得到的是:

vmlinuz:ELF 64 位 LSB 共享对象,AMD x86-64,版本 1,已剥离

然而,我想要得到的是这样的:

vmlinuz: Linux/x86 Kernel, Setup Version 0x20a, bzImage, Version 2.6.37, Version 2.6.37-40, RO-rootFS, root_dev 0x301, swap_dev 0x4, Normal VGA

感谢您的帮助!

【问题讨论】:

    标签: linux linux-kernel elf


    【解决方案1】:

    1.修改Makefile,在objcopy cmd中添加-O二进制,如下:

    在 linux-3.7.4/arch/x86/boot/compressed/Makefile:

    OBJCOPYFLAGS_vmlinux.bin := -R .comment -S **-O binary**
    
        $(obj)/vmlinux.bin: vmlinux FORCE 
    
            $(call if_changed,objcopy)
    

    2.注释parse_elf,如:

    在 linux-3.7.4/arch/x86/boot/compressed/misc.c 中

    asmlinkage void decompress_kernel(...)
    
    {
    
        ...
    
        decompress(input_data, input_len, ...);
    
        /* parse_elf(output); */
    
        ...
    
    }
    

    【讨论】:

    • 您的代码格式似乎有点不正确,也许您可​​以尝试改进一下。
    【解决方案2】:

    Linux 使用 ELF 内核映像已经有一段时间了,这不是最近的发展。那么为什么你认为你不能使用 ELF 图像呢?

    【讨论】:

    • 我使用clusterworx来管理集群节点。对于与 clusterworx 一起使用的映像,当您执行“file vmlinuz”时,您应该得到类似:“vmlinuz: Linux/x86 Kernel, Setup Version 0x20a, bzImage, Version 2.6.37, Version 2.6.37-40, RO-rootFS , root_dev 0x301, swap_dev 0x4, Normal VGA”,但我得到的是:“vmlinuz: ELF 64-bit LSB shared object, AMD x86-64, version 1, stripped”。
    • 嗯,编译内核后,内核镜像并不是你最终得到的内核源代码目录下的那个vmlinuz文件。这是文件 arch/${YOUR_ARCHITECTURE}/boot/bzImage
    • 不幸的是,我可以在源代码树(vmlinuz、bzImage 等)的某个位置找到的所有候选文件文件都报告为 ELF...
    • 这是因为 Linux 内核链接到了 ELF 映像中。从 2.2.x 后期内核开始就是这样,即现在已经有 10 多年了。
    猜你喜欢
    • 2011-01-21
    • 2017-03-09
    • 2016-02-24
    • 1970-01-01
    • 2019-07-18
    • 2013-02-23
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多