在ELF可执行文件中包含单独的二进制文件

时间:2016-02-08 09:05:59

标签: makefile linker osdev objcopy

我正在开发一个操作系统。我想在我的主内核asm中加入一个小elf程序,它可以作为第一个加载进程。我无法让这个工作。该计划是initcode.s。我使用从xv6操作系统源修改的以下Makefile来执行此任务:

initcode:
    $(AS) $(ASFLAGS) initcode.s -o initcode.o
    ld $(LDFLAGS) -N -e start -Ttext 0 -o initcode initcode.o
    objcopy --input binary --output elf32-i386 --binary-architecture i386 initcode.out initcode


kernel.elf: $(OBJECTS) initcode
    ld -T link.ld -melf_i386 $(OBJECTS) -o kernel.elf initcode

内核编译和链接很好。 objcopy还创建标记,使我能够从内核代码中找到二进制文件。但是initcode的内容被删除了。内容与initcode.out中的汇编程序步骤不同。

如何在我的主initcode.s中将kernel.elf包含为单独的二进制文件并生成一些标记,以便从内核中找到它?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我可以想到两种简单的方法。如果您愿意,肯定会有更复杂的方法。

  1. 编写一个小实用程序,将initcode二进制文件转换为包含GAS数据部分的asm文件(甚至是C文件)。然后组装该文件并将其与您的内核链接。您的initcode将在内核中显示为变量。
  2. OR

    1. 在链接步骤之后,简单地将initcode二进制文件“cat”到内核精灵的末尾。此方法取决于您的加载程序是否乐意支持此操作。