Компиляция C в ELF32 в Windows

Я пытаюсь скомпилировать программу C в формат ELF в Windows, поэтому я попытался сделать несколько вещей:

  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. Я прекрасно понимаю, что это руководство сделано для Linux, а не для Windows, но я просто... Скажем так, у меня проблемы с использованием Linux.

Я не знаю, какие файлы нужны для решения моей проблемы, поэтому вот:

  1. ядро.с
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

Остальные файлы почти копипасты, поэтому я не думаю, что их нужно включать


person TopchetoEU    schedule 16.01.2021    source источник
comment
Проблема кросс-компилятора будет заключаться в инструментах сборки, а не в коде. Следовали ли вы советам в инструкциях по установке, включая правильное расположение вещей на вашем пути, и в некоторых случаях вам может потребоваться скопировать все файлы из двух каталогов в один?   -  person Michael Petch    schedule 16.01.2021
comment
Что касается компиляции с MinGW, что-то кажется неправильным, если не было вывода объектного файла. Было ли сообщение об ошибке? Вы упомянули test.c, может быть, вы имели в виду kernel.c?   -  person Michael Petch    schedule 16.01.2021
comment
@MichaelPetch Да, я имел в виду kernel.c, также компиляция с GCC не отображает ошибок и не выводит. Также я не последовал совету (который я, вероятно, должен был сделать, прежде чем спрашивать о Stackoverflow и о том, что я собираюсь делать)   -  person TopchetoEU    schedule 16.01.2021
comment
@MichaelPetch Это не сработало; Я помещаю все вещи в одну папку, а также PATH   -  person TopchetoEU    schedule 16.01.2021


Ответы (1)


Итак, это немного сложно, так что пристегнитесь.

Во-первых, я использовал NASM и MinGW. Вот список моих следующих действий:

  1. Собрал bootsector.asm как обычно (nasm bootsect.asm -o bootset.o)
  2. Собрал kernel_entry.asm с nasm kernel_entry.asm -f elf32 -o kernel_entry.o,после
  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 в bin с objcopy -O binary -j .text kernel.tmp kernel.bin
  6. Объединены bootsect.o и kernel.bin с type bootsect.o kernel.bin > drive.bin
person TopchetoEU    schedule 16.01.2021
comment
Включение/извлечение только раздела .text с objcopy будет проблематичным, если вы когда-либо будете использовать какие-либо статические данные (.data или .bss) или константы (.rodata), такие как строковые литералы. Лучше использовать скрипт компоновщика, чтобы сообщить ld, куда поместить данные в двоичном файле. например Пример @MichaelPetch здесь: Скомпилируйте загрузчик asm с внешним кодом c - person Peter Cordes; 17.01.2021