我们有一个没有ELF头的Linux内核二进制文件,我们的引导加载程序将根据来自ELF头的计算加载内核映像(早期的QNX内核映像有ELF头),但由于我们的Linux内核映像没有一个ELF头,我们的引导加载程序拒绝将此内核映像加载到内存中 .
由于某些原因,我们没有更改引导加载程序代码的选项,因此我们唯一的选择是将ELF标头插入具有特定入口点的Linux BIN文件中 .
实现它的方法是什么?
objcopy 命令能够使用适当的ELF头包装二进制文件 . 例如,以下命令将二进制文件 input.in 转换为i386目标文件 output.o :
objcopy
input.in
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 部分 .
_binary_input_bin_start
_binary_input_bin_end
_binary_input_bin_size
.data
然后,您需要使用 ld 和链接描述文件来设置适当的加载/虚拟/物理地址和入口点 . 以下是最小脚本:
ld
ENTRY(_start); SECTIONS { _start = 0x12000; . = 0x10000; .data : { *(.data) } }
但可能需要进行大量修改,具体取决于您的引导加载程序的工作原理,物理内存布局,内核所在的位置,架构等 . 一旦调整,它就可以用于生成最终的ELF文件,如下所示:
ld -m elf_i386 output.o -T binary.ld -o output.elf
1 回答
objcopy
命令能够使用适当的ELF头包装二进制文件 . 例如,以下命令将二进制文件input.in
转换为i386目标文件output.o
:将在
output.o
中定义三个符号:_binary_input_bin_start
,_binary_input_bin_end
和_binary_input_bin_size
. 此外,输入文件的数据将位于.data
部分 .然后,您需要使用
ld
和链接描述文件来设置适当的加载/虚拟/物理地址和入口点 . 以下是最小脚本:但可能需要进行大量修改,具体取决于您的引导加载程序的工作原理,物理内存布局,内核所在的位置,架构等 . 一旦调整,它就可以用于生成最终的ELF文件,如下所示: