如何将Linux内核Bin文件转换为ELF格式

7
我们有一个Linux内核二进制文件,但是没有ELF头文件。我们的引导加载程序将根据来自ELF头文件的计算加载内核映像(早期的QNX内核映像有ELF头),但由于我们的Linux内核映像没有ELF头文件,因此我们的引导加载程序拒绝将该内核映像加载到内存中。
由于某些原因,我们无法更改引导加载程序代码,所以我们唯一的选择是在具有特定入口点的Linux BIN文件中插入ELF头文件。
如何实现呢?
1个回答

17
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文件的链接器。是否有任何选项可以在链接脚本中给出以进行正确的链接? - Amit Singh Tomar
你能提供一下你收到的错误信息吗?另外,你正在构建什么架构的项目?你需要确保使用与你的工具链相对应的objcopy版本和链接器。 - davidg
我不确定,抱歉@AmitSinghTomar。也许值得创建一个新问题,并提供完整的错误细节,以便其他人可以尝试解决它,或者取消接受此答案,以便其他人知道它并没有完全回答您的问题? - davidg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接