Ich habe C für 2-3 Jahre geschrieben und vor kurzem Assembly abgeholt, aber da ich Windows benutze, musste ich noch nie make-Dateien verwenden, da ich Visual Studio gerade benutzt habe. Ich versuche Cygwin und einen i686 Cross-Compiler zu verwenden, um c- und Assemblydateien zu kompilieren und sie dann zu einer binären Datei zu verbinden, die mein Betriebssystem darstellt. Ich bin neu, um Dateien zu machen, also weiß ich nicht, wie ich das richtig machen soll. Dies ist, was ich bisher für die Makefile
bekam:Kompilieren von x86 und c mit Makefile
CC = i686-elf-gcc
CC_FLAGS = -c -std=gnu99 -ffreestanding -O2 -Wall -Wextra -I./include
AS = i686-elf-as
LD = i686-elf-gcc -T linker.ld -o myos.bin
LD_FLAGS = -ffreestanding -O2 -nostdlib -lgcc
O_FILES = $(wildcard src/*.o)
all: $(O_FILES)
$(LD) $(LD_FLAGS) $(O_FILES)
src/%.o: src/%.c
$(CC) $(CC_FLAGS) -o [email protected] $<
src/%.o: src/%.asm
$(AS) -o [email protected] $<
Ich erhalte eine Fehlermeldung besagt, dass der Linker nicht den Eintrag Symbol finden _start
so offensichtlich ist nichts zu kompilieren. Wie würde ich das beheben?
Meine src/linker.ld
-Datei, die _start
als Einstiegspunkt definiert ist:
ENTRY(_start)
SECTIONS
{
. = 1M;
.text BLOCK(4K) : ALIGN(4K)
{
*(.multiboot)
*(.text)
}
.rodata BLOCK(4K) : ALIGN(4K)
{
*(.rodata)
}
.data BLOCK(4K) : ALIGN(4K)
{
*(.data)
}
.bss BLOCK(4K) : ALIGN(4K)
{
*(COMMON)
*(.bss)
}
}
Die src/boot.asm
Datei ich bin mit meiner definiert _start
Label:
# Declare constants for the multiboot header.
.set ALIGN, 1<<0 # align loaded modules on page boundaries
.set MEMINFO, 1<<1 # provide memory map
.set FLAGS, ALIGN | MEMINFO # this is the Multiboot 'flag' field
.set MAGIC, 0x1BADB002 # 'magic number' lets bootloader find the header
.set CHECKSUM, -(MAGIC + FLAGS) # checksum of above, to prove we are multiboot
.section .multiboot
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM
.section .bss
.align 16
stack_bottom:
.skip 16384 # 16 KiB
stack_top:
.section .text
.global _start
.type _start, @function
_start:
mov $stack_top, %esp
call kernel_main
cli
1: hlt
jmp 1b
.size _start, . - _start
Der Fehler, den Sie erhalten, ist ein Linker-Fehler. Sie zeigen uns nicht Ihre 'linker.ld', aber es klingt, als würden Sie einen Einstiegspunkt von' _start' verwenden, aber Sie haben keine '_start'-Bezeichnung in Ihrem Code. –
_start ist in boot.asm definiert und hier ist linker.ld https://pastebin.com/MuJxLQW8 –
Können Sie uns Ihre 'boot.asm' zeigen. Das Problem ist, dass dies kein minimales vollständiges überprüfbares Beispiel ist. Wenn Sie Ihr gesamtes Projekt zur Verfügung stellen, wäre es sogar besser. –