【问题标题】:How to convert Linux kernel Bin into ELF format如何将Linux内核Bin转换为ELF格式
【发布时间】:2013-02-23 19:56:05
【问题描述】:

我们有一个没有 ELF 头文件的 Linux 内核二进制文件,我们的引导加载程序将根据来自 ELF 头文件的计算来加载内核映像(早期的 QNX 内核映像具有 ELF 头文件),但是由于我们的 Linux 内核映像没有 ELF 标头,我们的引导加载程序拒绝将此内核映像加载到内存中。

由于某些原因,我们无法更改引导加载程序代码,因此我们唯一的选择是将 ELF 标头插入到具有特定入口点的 Linux BIN 文件中。

实现的方法是什么?

【问题讨论】:

    标签: linux-kernel elf bootloader


    【解决方案1】:

    objcopy 命令能够使用适当的 ELF 标头包装二进制文件。例如,以下命令会将二进制文件input.in转换为i386对象文件output.o

    objcopy -I binary -O elf32-i386 --binary-architecture i386 input.bin output.o
    

    output.o 中将定义三个符号:_binary_input_bin_start_binary_input_bin_end_binary_input_bin_size。此外,您输入文件的数据将位于 .data 部分中。

    然后您需要使用ld 和链接描述文件来设置适当的加载/虚拟/物理地址和入口点。以下是一个最小的脚本:

    ENTRY(_start);
    
    SECTIONS
    {
        _start = 0x12000;
        . = 0x10000;
        .data : {
            *(.data)
        }
    }
    

    但可能需要进行大量修改,具体取决于引导加载程序的工作方式、物理内存布局、内核所在的位置、架构等。一旦调整,它就可以用来生成最终的 ELF 文件如下:

    ld -m elf_i386 output.o -T binary.ld -o output.elf
    

    【讨论】:

    • 感谢 Davidg 的回复,我们能够从 bin 文件中创建一个带有特定入口地址的精灵,但是在编译我们的 IFS 映像时,我们的工具“mkxfs”说找不到这个特定精灵的链接器文件。我们可以在链接描述文件中提供任何选项来正确链接吗??
    • 您能否提供您收到的确切错误消息?另外,您要构建什么架构?您需要确保使用工具链附带的 objcopy 版本和链接器。
    • 我不确定,抱歉@AmitSinghTomar。也许值得创建一个包含错误的完整详细信息的新问题,以便其他人可以尝试解决它,或者不接受此答案以便其他人知道它不能完全回答您的问题?
    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 2010-10-17
    • 2016-01-22
    • 2012-12-08
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多