未找到GRUB Multiboot标头

时间:2015-01-02 15:01:21

标签: linker 32-bit osdev grub multiboot

在阅读了这个this question及其主要答案之后,我在我的内核上运行了readelf,并注意到我的.text部分位于0x00101000而不是0x00100000。我还注意到上面的部分是.not.gnu.build-i,它位于.text部分应该是的位置。有没有办法让我的.text部分在正确的位置?我已经使用align 4将其设置为1M。

2 个答案:

答案 0 :(得分:2)

问题是LD(或 LD 通过 GCC )会自动在第一个4k中放置一个备注部分(如果生成了一个部分)。如果将最终内核与 GCC 链接,则将-Wl,--build-id=none选项传递给它。如果您直接使用 LD 链接最终二进制文件,则可以将其传递给--build-id=none

如果编写多引导 ELF 对象,则此额外部分的存在可以强制mulitboot头超出文件中的8k位置。这是因为 ELF 标头通常占用文件前4k的最小值。为.note.gnu.build-id添加4k,.multiboot部分现在超出物理文件的8k标记。这将导致像GRUB这样的多引导加载程序认为您的 ELF 可执行文件没有多引导头,因为它只查看文件的前8k。

答案 1 :(得分:0)

您的链接器脚本(假设它与其他问题中的相同)是问题:通过告诉它对齐部分并将multiboot放在一个单独的部分中,为它分配4k,所以.text以1M + 4k的偏移量开始,这会导致您的问题。将其更改为以下内容:

SECTIONS
{
    . = 1M;

    .text ALIGN(4K) :
    {
        *(.multiboot)
        *(.text)
    }

[snip]