我们有一个没有 ELF 标头的 Linux 内核二进制文件,我们的引导加载程序将根据来自 ELF 标头的计算加载内核映像(早期的 QNX 内核映像具有 ELF 标头),但是由于我们的 Linux 内核映像没有一个 ELF 标头,我们的引导加载程序拒绝将此内核映像加载到内存中。
由于某些原因,我们无法更改引导加载程序代码,因此我们唯一的选择是将 ELF 标头插入到具有特定入口点的 Linux BIN 文件中。
实现它的方法是什么?
我们有一个没有 ELF 标头的 Linux 内核二进制文件,我们的引导加载程序将根据来自 ELF 标头的计算加载内核映像(早期的 QNX 内核映像具有 ELF 标头),但是由于我们的 Linux 内核映像没有一个 ELF 标头,我们的引导加载程序拒绝将此内核映像加载到内存中。
由于某些原因,我们无法更改引导加载程序代码,因此我们唯一的选择是将 ELF 标头插入到具有特定入口点的 Linux BIN 文件中。
实现它的方法是什么?
该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