在 Windows 上将 C 编译为 ELF32
Compiling C to ELF32 on Windows
我试图在 Windows 上将 C 程序编译为 ELF 格式,所以我尝试做几件事:
- 使用 MinGW
gcc -Wall -c test.c -o test.o
编译,但没有 test.o 作为输出
- 下载了 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.
时遇到问题
我不知道需要哪些文件来解决我的问题,所以这里是:
- kernel.c
void my_function() {
}
int main() {
return 0;
}
- kernel_entry.asm
[bits 32]
[extern main]
call main
jmp $
- 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。这是我的以下操作的列表:
- 正常组装 bootsector.asm (
nasm bootsect.asm -o bootset.o
)
- 在
之后 nasm kernel_entry.asm -f elf32 -o kernel_entry.o
组装 kernel_entry.asm
- 编译 kernel.c 与
gcc -m32 -c kernel.c -o kernel.o -ffreestanding -nostdlib -nostdinc
- 将 kernel_entry.o 和 kernel.tmp 链接到
ld -m i386pe -o kernel.tmp -Ttext 0x1000 kernel_entry.o kernel.o
- 已将 kernel.tmp 转换为
objcopy -O binary -j .text kernel.tmp kernel.bin
的 bin
- 合并 bootsect.o 和 kernel.bin 与
type bootsect.o kernel.bin > drive.bin
我试图在 Windows 上将 C 程序编译为 ELF 格式,所以我尝试做几件事:
- 使用 MinGW
gcc -Wall -c test.c -o test.o
编译,但没有 test.o 作为输出 - 下载了 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.
时遇到问题我不知道需要哪些文件来解决我的问题,所以这里是:
- kernel.c
void my_function() {
}
int main() {
return 0;
}
- kernel_entry.asm
[bits 32]
[extern main]
call main
jmp $
- 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。这是我的以下操作的列表:
- 正常组装 bootsector.asm (
nasm bootsect.asm -o bootset.o
) - 在 之后
- 编译 kernel.c 与
gcc -m32 -c kernel.c -o kernel.o -ffreestanding -nostdlib -nostdinc
- 将 kernel_entry.o 和 kernel.tmp 链接到
ld -m i386pe -o kernel.tmp -Ttext 0x1000 kernel_entry.o kernel.o
- 已将 kernel.tmp 转换为
objcopy -O binary -j .text kernel.tmp kernel.bin
的 bin
- 合并 bootsect.o 和 kernel.bin 与
type bootsect.o kernel.bin > drive.bin
nasm kernel_entry.asm -f elf32 -o kernel_entry.o
组装 kernel_entry.asm