-1

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

4

2 回答 2

2

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

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

于 2015-11-19T22:28:27.427 回答
0

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

SECTIONS
{
    . = 1M;

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

[snip]
于 2015-01-13T15:21:27.117 回答