如何将Linux内核Bin转换为ELF格式

Ami*_*mar 4 elf linux-kernel bootloader

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

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

实现它的方法是什么?

dav*_*idg 13

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

objcopy -I binary -O elf32-i386 --binary-architecture i386 input.bin output.o
Run Code Online (Sandbox Code Playgroud)

三个符号将被定义output.o:_binary_input_bin_start,_binary_input_bin_end_binary_input_bin_size.此外,输入文件的数据将在一个.data部分中.

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

ENTRY(_start);

SECTIONS
{
    _start = 0x12000;
    . = 0x10000;
    .data : {
        *(.data)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

ld -m elf_i386 output.o -T binary.ld -o output.elf
Run Code Online (Sandbox Code Playgroud)