2013-03-08 227 views
3

我们有一个没有ELF头的Linux内核二进制文件,我们的引导加载程序将根据来自计算器的计算加载内核映像(较早的QNX内核映像具有ELF头文件) ELF头文件,但由于我们的Linux内核映像没有ELF头文件,我们的引导加载程序拒绝将此内核映像加载到内存中。如何将Linux内核Bin转换为ELF格式

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

实现它的方法是什么?

回答

11

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 
+0

感谢Davidg您的回复,我们能够创建一个小精灵了特别的入口地址bin文件,但在编译时我们IFS图像我们的工具“ mkxfs“表示无法找到这个特定的elf文件的链接器。是否有任何选项,我们可以在链接器脚本中进行正确的链接? – 2013-03-09 07:23:21

+0

你能提供你正在得到的确切的错误信息吗?另外,你正在建筑什么样的建筑?您需要确保您使用的objcopy版本和工具链附带的链接器。 – davidg 2013-03-09 12:02:03

+0

我不确定,对不起@AmitSinghTomar。也许值得用错误的全部细节创建一个新问题,以便其他人可以尝试解决它,或者不接受这个答案,以便其他人知道它不能完全回答你的问题? – davidg 2013-03-10 22:48:22