2016-08-09 12 views
0

Ich arbeite an einem einfachen Betriebssystem (zum Spaß), aber ich bin auf ein ziemlich eigenartiges Problem gestolpert, das ich nicht finden kann, wie zu beheben.Makefile nicht Binärcode richtig kopieren

Wenn ich versuche, kernel.bin zu boot/boot_sect.bin zu verketten und das Ergebnis in os-image zu speichern, wird anscheinend der Assemblycode kopiert, aber die Datei kernel.bin wird wie erwartet verkettet. Allerdings boot/boot_sect.bin existiert und enthält die korrekten binären Daten, wie ich unten demonstriere.

Wenn ich boot/boot_sect.bin in boot_sect_real.bin mit dem Windows 10-Dateiexplorer kopiert habe und dann den gleichen Befehl ausgeführt habe, aber stattdessen boot_sect_real.bin, funktioniert alles wie erwartet. Es scheint also etwas damit zu tun zu haben, dass sich boot_sect.bin in einem Verzeichnis befindet oder sich boot_sect.bin und boot_sect.asm im selben Verzeichnis befinden. Ich bin mit MinGW auch ein Makefile zu verwenden (mit mingw32-make)

Dies ist das Makefile, mit dem OS-Bildbefehl Kommentare markiert mit:

C_SOURCES = $(wildcard kernel/*.c drivers/*.c) 
HEADERS = $(wildcard kernel/*.h drivers/*.h) 

OBJ = ${C_SOURCES:.c=.o} 

all: os-image 

######################################## 
os-image: boot/boot_sect.bin kernel.bin 
    copy /b $<+kernel.bin os-image 
######################################## 

%.o : %.c ${HEADERS} 
    gcc -ffreestanding -c $< -o [email protected] 

%.o : %.asm 
    nasm $< -f elf -o [email protected] 

%.bin : %.asm 
    nasm $< -f bin -o [email protected] 

kernel.bin: kernel/kernel_entry.o ${OBJ} 
    ld -T NUL -o kernel.tmp -Ttext 0x1000 $^ 
    objcopy -O binary -j .text kernel.tmp kernel.bin 

Dies ist, was das Verzeichnis, das ich ist das alles in aussieht wie laufen: image

Dies ist der Inhalt des Boot-Verzeichnisses: image

Und das ist der Inhalt des Kernel-Verzeichnis: image

(das Treiber-Verzeichnis ist jetzt leer)

Dies ist der Inhalt der Datei kernel.bin: image

Und dies ist der Inhalt des boot/boot_sect.bin Datei: image

Die os-Image-Datei enthält jedoch den Assembly-Code? image

(Ich bin mit dem Kopierbefehl mit/b)

Gibt es eine Möglichkeit, den binären Inhalt von kernel.bin verketten kann zu booten/boot_sect.bin und das Ergebnis in os-Bild speichern? Was läuft falsch?

UPDATE: Ich habe dieses Ereignis gefunden, wenn es etwas wert ist: image Es ist sogar die .asm Datei obwohl ich im Befehl angegebenen .bin.

Antwort

0

Nun, ich fühle mich jetzt sicher dumm.

Ich änderte

copy/b boot/boot_sect.bin + kernel.bin os-Bild

zu

copy/b boot \ boot_sect.bin + kernel.bin os-Bild

Es war ein einfacher Zeichenersatz weg!

+1

Fast alle Windows-Programme akzeptieren beide Stil von Schrägstrich. Allerdings der alte Befehl.Shell-Programme erlauben meistens keine Schrägstriche und Sie müssen Backslashes verwenden. – MadScientist