在Windows上将C编译为ELF32
我正在尝试在Windows上将C程序编译为ELF格式,因此我尝试做了几件事:在Windows上将C编译为ELF32,c,windows,assembly,gcc,elf,C,Windows,Assembly,Gcc,Elf,我正在尝试在Windows上将C程序编译为ELF格式,因此我尝试做了几件事: 使用MinGWgcc-Wall-c test.c-o test.o编译,但没有得到test.o作为输出 下载(32位版本),并使用“[…]/i386 elf gcc”-c test.c-o test.o编译,但我得到了错误i386 elf gcc/libexec/gcc/i386 elf/5.2.0/cc1.exe:加载共享库时出错:?:无法打开共享对象文件:没有这样的文件或目录 我想做的是遵循这个教程:,但我一直在做
gcc-Wall-c test.c-o test.o编译,但没有得到test.o作为输出
“[…]/i386 elf gcc”-c test.c-o test.o
编译,但我得到了错误i386 elf gcc/libexec/gcc/i386 elf/5.2.0/cc1.exe:加载共享库时出错:?:无法打开共享对象文件:没有这样的文件或目录
void my_函数(){
}
int main(){
返回0;
}
其他文件几乎都是复制粘贴的,所以我认为没有必要包含它们所以,有点复杂,所以请扣上安全带 首先,我使用了NASM和MinGW。以下是我的以下行动列表:
nasm bootssect.asm-o bootset.o
)nasm kernel\u entry.asm-f elf32-o kernel\u entry.o组装kernel\u entry.asm,在
gcc-m32-c kernel.c-o kernel.o-ffreestanding-nostlib-nostdinc编译kernel.c
ld-mi386pe-o kernel.tmp-Ttext 0x1000 kernel_entry.o kernel.o链接kernel_entry.o和kernel.tmp
objcopy-O binary-j.text kernel.tmp kernel.bin将kernel.tmp转换为bin
类型bootssect.o kernel.bin>drive.bin
交叉编译器的问题将是构建工具,而不是代码。您是否遵循了安装说明中的建议,包括正确设置路径,并且在某些情况下建议您可能必须将两个目录中的所有文件复制到一个目录中?对于使用MinGW进行编译,如果没有对象文件输出,则似乎有问题。有错误消息吗?您提到的
test.c
可能是指kernel.c
?@MichaelPetch是的,我指的是kernel.c,而且使用GCC进行编译时没有显示错误,也没有输出。此外,我也没有遵循建议(在询问Stackoverflow和我将要做什么之前,我可能应该这么做)@MichaelPetch,它不起作用;我把所有的东西都放在一个文件夹中,路径内容只包含/提取。如果你使用任何静态数据(.data
或.bss
)或常量(.rodata
)之类的字符串文字,那么带有对象的文本部分就会有问题。最好使用链接器脚本告诉ld在二进制文件中的位置放置内容。e、 g.@MichaelPetch的例子如下:
[bits 32]
[extern main]
call main
jmp $
[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