在 Windows 上将 C 编译为 ELF32

Compiling C to ELF32 on Windows

我试图在 Windows 上将 C 程序编译为 ELF 格式,所以我尝试做几件事:

  1. 使用 MinGW gcc -Wall -c test.c -o test.o 编译,但没有 test.o 作为输出
  2. 下载了 https://github.com/nativeos/i386-elf-toolchain/releases(32 位版本),并使用 "[...]/i386-elf-gcc" -c test.c -o test.o 编译,但出现错误 i386-elf-gcc/libexec/gcc/i386-elf/5.2.0/cc1.exe: error while loading shared libraries: ?: cannot open shared object file: No such file or directory

我想做的是按照这里的教程进行操作:https://github.com/cfenollosa/os-tutorial,但我一直坚持在 Assembly 和 C 之间进行实际的 link。我很清楚本教程是为 Linux 而不是 Windows 制作的,但我只是......假设我在使用 Linux.

时遇到问题

我不知道需要哪些文件来解决我的问题,所以这里是:

  1. kernel.c
void my_function() {
}

int main() {
    return 0;
}
  1. kernel_entry.asm
[bits 32]
[extern main]
call main
jmp $
  1. boot.asm
[org 0x7c00]

kernel_offset equ 0x1000

    mov [bootDrive], dl

    mov bp, 0x9000
    mov sp, bp

    call switch_to_pm

    call BEGIN_PM

    jmp $

%include "gdt_init.asm"
%include "switch_32.asm"

bootDrive db 0

[bits 32]
BEGIN_PM:
    call clear_screen
    call kernel_offset

    mov ebx, errorMSG
    call print_string_pm

    jmp $

%include "io/clear.asm"
%include "io/print.asm"


errorMSG db "Something went terribly wrong. Restart the PC to fix it", 0

; bootsector
times 510-($-$$) db 0
dw 0xaa55

其他文件几乎是复制粘贴,所以我认为没有必要包含它们

所以,有点复杂,所以系好安全带。

首先,我使用了 NASM 和 MinGW。这是我的以下操作的列表:

  1. 正常组装 bootsector.asm (nasm bootsect.asm -o bootset.o)
  2. 之后 nasm kernel_entry.asm -f elf32 -o kernel_entry.o 组装 kernel_entry.asm
  3. 编译 kernel.c 与 gcc -m32 -c kernel.c -o kernel.o -ffreestanding -nostdlib -nostdinc
  4. 将 kernel_entry.o 和 kernel.tmp 链接到 ld -m i386pe -o kernel.tmp -Ttext 0x1000 kernel_entry.o kernel.o
  5. 已将 kernel.tmp 转换为 objcopy -O binary -j .text kernel.tmp kernel.bin
  6. 的 bin
  7. 合并 bootsect.o 和 kernel.bin 与 type bootsect.o kernel.bin > drive.bin