Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows上将C编译为ELF32_C_Windows_Assembly_Gcc_Elf - Fatal编程技术网

在Windows上将C编译为ELF32

在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:加载共享库时出错:?:无法打开共享对象文件:没有这样的文件或目录 我想做的是遵循这个教程:,但我一直在做

我正在尝试在Windows上将C程序编译为ELF格式,因此我尝试做了几件事:

  • 使用MinGW
    gcc-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:加载共享库时出错:?:无法打开共享对象文件:没有这样的文件或目录
  • 我想做的是遵循这个教程:,但我一直在做汇编和C之间的实际链接。我很清楚这个教程是为Linux而不是Windows编写的,但我只是。。。让我们假设我在使用Linux时遇到了问题

    我不知道需要什么文件来解决我的问题,所以这里有:

  • kernel.c
  • void my_函数(){
    }
    int main(){
    返回0;
    }
    
  • kernel_entry.asm
  • boot.asm

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

    所以,有点复杂,所以请扣上安全带

    首先,我使用了NASM和MinGW。以下是我的以下行动列表:

  • 正常组装bootsector.asm(
    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合并为
    类型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