【问题标题】:Jump to ELF file跳转到 ELF 文件
【发布时间】:2013-12-26 14:57:59
【问题描述】:

我正在尝试编写一个简单的引导加载程序。所以,我切换到保护模式,跳转到.code32 并尝试跳转到由ld 链接的ELF 文件。 ld.ELF (7F 45 4C ...) 放入请求文件中。 Bochs 将其解释为jnle .+69 命令,所以这不是我一直在等待的结果。如何将 entry 点放在文件的开头?

有一个linker.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解释器(解析器)的链接吗?

标签: gcc assembly x86 ld elf


【解决方案1】:

为了执行 ELF 二进制文件,您必须从文件中读取数据并进行相应的解释。对此的描述可以在 PDF 中找到。

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

【讨论】:

    【解决方案2】:

    我曾经创建一个ELF文件,主要代码用C编写并用gcc编译

    gcc -nostdlib -nostartfiles -nodefaultlibs -fno-builtin -O0 -c 内核.c

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

    [bits 32]
    [global start]
    [global kbhit]
    [global getscan]
    [extern main]
    
    start:  call main   ; jump to main() in kernel.c
    
    hang:   hlt     ; halt the cpu
        jmp hang
    
    kbhit:
       in al,0x64
       and al,1
       ret
    
    getscan:
       in al,0x60
       ret
    

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

    用 nasm 组装,也在 ELF 中:

    nasm -f elf init.s

    然后将两者链接在一起并将生成的文件存储在 USB 中 MBR 之后的扇区中(您的 MBR 应该从 USB 读取它,将其放入内存中,进入保护模式并跳转到“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)
      }
    }
    

    希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2021-03-17
      • 2023-03-15
      • 2015-11-07
      相关资源
      最近更新 更多