Autor Thema: Lowlevel Tutorial Problem  (Gelesen 11279 mal)

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« am: 18. April 2012, 17:45 »
Hallo,
ich versuche seit einiger Zeit dieses http://www.lowlevel.eu/wiki/C-Kernel_starten Tutorial zu kompilieren. Das builden der .asm und .c Datei funktioniert, aber das Linken mit der .txt geht nicht. Ich habe alles wie nach dem Tutorial gemacht mit dem gleichen Source. Ich erhalte dieses Fehlermeldung: "file not regognized: File format not recognized". Deshalb habe ich bei NASM das Format für die Datei kernel32.obj in elf umgewandelt. Jedoch erscheint dann beim linken dieser Fehler: "ld: cannot perform PE operations on non PE output file". Ich brauche bitte Hilfe.

LG

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 18. April 2012, 18:39 »
Willkommen an Board.

Um unter Windows vernünftig zu entwickeln brauchst du einen Cross-Compiler, der ELF-Dateien erstellt. Du kannst dir ganz einfach einen selbst kompilieren, wie in dem Artikel beschrieben, oder du nimmst zum Beispiel einen, den ich kompiliert habe.
Dieser Text wird unter jedem Beitrag angezeigt.

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 18. April 2012, 18:49 »
Ok hab deinen gedownloaded und installiert. Danke :). Jedoch habe ich die selben Probleme wie davor auch wenn ich anstatt "nasm -f aout -o kernel32.obj kernel32.asm" das hier nutze "nasm -f elf-o kernel32.obj kernel32.asm" ._.

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 18. April 2012, 19:16 »
Ich habs fast komplett geschaft :D. Ich hab anstatt ld i586-elf-ld benutzt. Aber jetzt erscheint dieser Fehler: "kernel.c:(/4+0x7): undefined reference to '___main'"

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 18. April 2012, 19:26 »
Du solltest darauf achten, dass du im Assemblercode die selbe Anzahl Unterstriche vor den Labels hast, wie im C-Code vor den Funktionsnamen (und Variablennamen). (Im Gegensatz zu MinGW, wo im Assemblercode ein Unterstrich mehr sein muss.) Wenn das nicht hilft, musst du mal sagen, mit welchen Parametern du den Compiler und den Linker aufrufst. Drei Unterstriche vor ___main ist relativ viel, und auch das /4 in kernel.c(/4+0x7) sieht komisch aus. Hast du eine Idee wo die herkommen könnte? Verwendest du zufällig Assembler im globalen Scope in der C-Datei?
Dieser Text wird unter jedem Beitrag angezeigt.

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 18. April 2012, 19:44 »
Zitat
Wenn das nicht hilft, musst du mal sagen, mit welchen Parametern du den Compiler und den Linker aufrufst.
1. nasm -f bin -o C:\Users\Toshiba\Desktop\ckernel\kernel16.bin C:\Users\Toshiba\Desktop\ckernel\kernel16.asm
2. nasm -f elf -o C:\Users\Toshiba\Desktop\ckernel\kernel32.obj C:\Users\Toshiba\Desktop\ckernel\kernel32.asm
3. gcc -ffreestanding -c -o C:\Users\Toshiba\Desktop\ckernel\ckernel.obj C:\Users\Toshiba\Desktop\ckernel\kernel.c
4. i586-elf-ld -T C:\Users\Toshiba\Desktop\ckernel\link.txt -o C:\Users\Toshiba\Desktop\ckernel\c32kernel.bin
Zitat
Verwendest du zufällig Assembler im globalen Scope in der C-Datei?
Nein, tue ich nicht.

Ich glaube ich habe einen Fehler im Tutorial gefunden, denn "char *VideoMem = (char*)0xB8000;" war im kernel.c "char *VideoMem = (char*)0xA8000;" (bei der gedownloadeten Version).

Und weil ich das -Os entfernt habe, erscheint das hier "C:\Users\Toshiba\Desktop\ckernel\ckernel\ckernel.obj:kernel.c:(.text+0xa): undef
ined reference to `___main'" beim 4. Schritt

Mfg

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 18. April 2012, 19:56 »
kommt nicht eigentlich bim Linker der Pfad zum Linkerskript gleich nach dem T, ohne Leerteichen?

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 18. April 2012, 19:58 »
Beides geht, aber das selbe Problem existiert.

Mfg

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 18. April 2012, 20:01 »
Wie setzt du den das ENTRY in deinem Linkerskript?
Vielleicht gleich das ganze link.txt

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 18. April 2012, 20:02 »

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 18. April 2012, 20:09 »
dort hast du ENTRY als "start" definiert. Wie sieht denn dein kernel32.asm aus?
Was hast du dir überhaupt mit kernel16.asm gedacht?

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 18. April 2012, 20:15 »
Ok, als ich die kernel16.asm (damit wollte ich in den protected mode) gelöscht und den Pfad aus dem Link.txt rausnahm, hatte ich den Fehler nicht mehr, aber ich habe einen anderen: "C:\Users\Toshiba\Desktop\ckernel\ckernel\kernel32.asm:(.text+0x1): undefined ref
erence to `main'"

http://codepad.org/KKfCVd11

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 18. April 2012, 20:16 »
Nimm i586-elf-gcc statt gcc. Das hätte ich noch dazu sagen sollen: Du solltest nur noch die Binutils und Compiler aus dem bin-Verzeichnis nehmen, also was mit i586-elf- anfängt. Das mit der undefined reference zu main sollte sich dann auflösen.

PS: Es gibt offensichtlich einen Grund, warum der rote Kasten mit der Warnung über dem Artikel steht. Bessere Artikel sind da verlinkt.
« Letzte Änderung: 18. April 2012, 20:19 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 18. April 2012, 20:23 »
Hab jetzt i586-elf-gcc genommen, aber das selbe Problem. "C:\Users\Toshiba\Desktop\ckernel\ckernel\kernel32.obj: In function `start':
C:\Users\Toshiba\Desktop\ckernel\ckernel\kernel32.asm:(.text+0x1): undefined reference to `main'".

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 18. April 2012, 20:39 »
Du solltest sicher gehen, dass du die Dateien neuerstellt hast, nachdem du den Compiler gewechselt hast, und dass du im Linkerskript die richtigen Pfade angibst. Mehr fällt mir auch nicht mehr ein.
Dieser Text wird unter jedem Beitrag angezeigt.

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 18. April 2012, 20:42 »
Ja, habe ich schon mehrmals neu erstellt und den Pfad habe ich auch öfters geprüft.

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 18. April 2012, 21:28 »
Ich habs geschafft :) mit dem Tutorial http://www.osdever.net/tutorials/view/writing-a-simple-c-kernel ich habe i586-elf... benutzt. Aber wieso bootet es nicht? Bochs sagt das es nichts zum booten gäbe.

http://codepad.org/05bv7HZr
http://codepad.org/IVJt1Nk4

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 18. April 2012, 21:50 »
Hast du eventuell versucht direkt den Kernel zu starten, ohne einen Bootloader?

Darf ich an dieser Stelle nochmal auf unsere Tutorialreihe hinweisen? Du kannst auch gleich bei Teil 4 anfangen: http://www.lowlevel.eu/wiki/Teil_4_-_Hello_World Weil es unter Windows etwas umständlich ist, ein Image mit einem Multiboot-Bootloader zu erstellen, solltest du für den Anfang qemu als Emulator verwenden. Wie in dem Tutorial erwähnt, kannst du den Kernel dann ohne dass ein Diskettenimage notwendig ist, mittels qemu -kernel kernel starten.
Dieser Text wird unter jedem Beitrag angezeigt.

DarkCoder

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 19. April 2012, 17:07 »
Danke :), werde ich mir dann anschauen.

Mfg

P4raFox

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 29. July 2012, 18:47 »
Anstatt dich mit den ganzen Problemen rumzuschlagen, die OS-Entwicklung unter Windows so mit sich bringen, würde ich dir doch empfehlen, Ubuntu innerhalb von Windows oder in einer VM (zB VirtualBox) zu installieren. Das funktioniert ganz leicht und ohne Probleme.

 

Einloggen