5

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

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

实现它的方法是什么?

4

1 回答 1

16

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
于 2013-03-09T02:29:46.497 回答