我们有一个没有ELF头的Linux内核二进制文件,我们的引导加载程序将根据来自计算器的计算加载内核映像(较早的QNX内核映像具有ELF头文件) ELF头文件,但由于我们的Linux内核映像没有ELF头文件,我们的引导加载程序拒绝将此内核映像加载到内存中。如何将Linux内核Bin转换为ELF格式
由于某些原因,我们没有选择更改我们的引导加载程序代码,所以我们唯一的选择是将ELF头插入具有特定入口点的Linux BIN文件。
实现它的方法是什么?
我们有一个没有ELF头的Linux内核二进制文件,我们的引导加载程序将根据来自计算器的计算加载内核映像(较早的QNX内核映像具有ELF头文件) ELF头文件,但由于我们的Linux内核映像没有ELF头文件,我们的引导加载程序拒绝将此内核映像加载到内存中。如何将Linux内核Bin转换为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
感谢Davidg您的回复,我们能够创建一个小精灵了特别的入口地址bin文件,但在编译时我们IFS图像我们的工具“ mkxfs“表示无法找到这个特定的elf文件的链接器。是否有任何选项,我们可以在链接器脚本中进行正确的链接? – 2013-03-09 07:23:21
你能提供你正在得到的确切的错误信息吗?另外,你正在建筑什么样的建筑?您需要确保您使用的objcopy版本和工具链附带的链接器。 – davidg 2013-03-09 12:02:03
我不确定,对不起@AmitSinghTomar。也许值得用错误的全部细节创建一个新问题,以便其他人可以尝试解决它,或者不接受这个答案,以便其他人知道它不能完全回答你的问题? – davidg 2013-03-10 22:48:22