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