Gcc 跳转到ELF文件

Gcc 跳转到ELF文件,gcc,assembly,x86,ld,elf,Gcc,Assembly,X86,Ld,Elf,我想写一个简单的引导程序。因此,我切换到保护模式,跳转到.code32并尝试跳转到ELF文件,由ld链接ld将.ELF(7F 45 4C…)放入文件的请求中。Bochs将其解释为+69指令,所以这不是我所哀叹的结果。如何将入口点放在文件的最下面 有一个链接器.ld脚本: ENTRY (boot) SECTIONS { .boot ALIGN(0x1000) : { bootstrap.o(.text) } .text ALIGN(0x1000) :

我想写一个简单的引导程序。因此,我切换到保护模式,跳转到
.code32
并尝试跳转到ELF文件,由
ld
链接
ld
.ELF
7F 45 4C…
)放入文件的请求中。Bochs将其解释为+69指令,所以这不是我所哀叹的结果。如何将入口点放在文件的最下面

有一个
链接器.ld
脚本:

ENTRY (boot)

SECTIONS {
    .boot   ALIGN(0x1000)   :   {   bootstrap.o(.text)   }
    .text   ALIGN(0x1000)   :   {   *(.text)    }
    .rodata ALIGN(0x1000)   :   {   *(.rodata)  }
    .data   ALIGN(0x1000)   :   {   *(.data)    }
    .bss    ALIGN(0x1000)   :   {   *(.bss)     }
}

为了执行ELF二进制文件,必须从文件中读取数据并进行相应的解释。有关这方面的说明,请参见


ELF是一个标头,其中包含有关文件的各个部分以及如何设置这些部分的信息。执行所有必要的步骤后,您可以跳转到入口点,该入口点也位于该标头中。

为了执行ELF二进制文件,您必须从文件中读取数据并相应地解释它。有关这方面的说明,请参见


ELF是一个标头,其中包含有关文件的各个部分以及如何设置这些部分的信息。在完成所有必要的步骤后,您可以跳转到入口点,入口点也可以在该标题中找到。

我使用C编写并使用gcc编译的主代码创建一个ELF文件

gcc-nostlib-nostartfiles-nodefaultlibs-fno内置-O0-c kernel.c

然后是另一个具有已知入口点的汇编代码[init.s](第一条指令位于第一个字节)

C程序[kbhit(),getscan(),…]将使用一些“固件”函数,因为我们无法在保护模式下访问BIOS

使用nasm组装,也使用ELF:

nasm-f elf init.s

然后将两者链接在一起,并将生成的文件存储在USB中MBR后的扇区中(您的MBR应该从USB读取文件,将其放入内存,进入保护模式,并将jumt存储到“kernel.bin”的第一个字节)

ld-T kernel.ld-o kernel.bin init.o kernel.o

对象文件(.o)的顺序很重要,将init.o放在第一位

kernel.ld:

OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
  .text  0x100000 : {
    *(.text)
  }
  .data  : {
    *(.data)
  }
  .bss  :
  {                     
    *(.bss)
  }
}

希望这个帮助

我曾经使用C编写的主代码和gcc编译的主代码创建过一个ELF文件

gcc-nostlib-nostartfiles-nodefaultlibs-fno内置-O0-c kernel.c

然后是另一个具有已知入口点的汇编代码[init.s](第一条指令位于第一个字节)

C程序[kbhit(),getscan(),…]将使用一些“固件”函数,因为我们无法在保护模式下访问BIOS

使用nasm组装,也使用ELF:

nasm-f elf init.s

然后将两者链接在一起,并将生成的文件存储在USB中MBR后的扇区中(您的MBR应该从USB读取文件,将其放入内存,进入保护模式,并将jumt存储到“kernel.bin”的第一个字节)

ld-T kernel.ld-o kernel.bin init.o kernel.o

对象文件(.o)的顺序很重要,将init.o放在第一位

kernel.ld:

OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
  .text  0x100000 : {
    *(.text)
  }
  .data  : {
    *(.data)
  }
  .bss  :
  {                     
    *(.bss)
  }
}

希望有此帮助

您不能直接跳转到ELF文件的第一个字节。您需要解释ELF文件,根据其中的描述设置适当的段,找到适当的入口点,然后跳转到该入口点。您能给一个指向ELF的简单解释器(解析器)的链接吗?您不能只跳转到ELF文件的第一个字节。您需要解释ELF文件,根据其中的描述设置适当的段,找到适当的入口点,然后跳转到该入口点。您能给一个指向ELF的简单解释器(解析器)的链接吗?