Error 13: Invalid or unsupported executable while booting simple kernel in grub with string literal

后端 未结 1 863
清酒与你
清酒与你 2020-12-19 14:01

I\'ve written a simple kernel that tries to write two characters to the frame buffer.

If I define a string literal in the kernel, I get the following output when it

相关标签:
1条回答
  • 2020-12-19 14:13

    You have an extra colon at the end of section .text: so that creates a new section named .text:. For some obscure reason that I couldn't find out from a quick glance at the documentation, this section is emitted to the output even though it is not listed in your linker script. When you have no literal data in the C code, you are lucky that it still falls within the first 8kiB of the image, so that the multiboot header is in the required portion. If you do have a string literal, you will get a new section .rodata and that, for yet another obscure reason, gets sorted before your .text: but after the standard .text. Example:

    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
      0 .text         00000001  00100000  00100000  00001000  2**4
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
      1 .rodata       00000005  00101000  00101000  00002000  2**2
                      CONTENTS, ALLOC, LOAD, READONLY, DATA
      2 .text:        00000018  00101008  00101008  00002008  2**2
                      CONTENTS, ALLOC, LOAD, READONLY, DATA
      3 .bss          0000100a  00102000  00102000  00003000  2**2
                      ALLOC
    

    As you can see it's no longer within the first 8kiB of the image, so grub will be very sad.

    TL;DR: remove the extra colon after section .text:.

    0 讨论(0)
提交回复
热议问题