| Zeile 1: | Zeile 1: | ||
| − | Für Windows wird ein [[Cross-Compiler]] benötigt, um [[ELF]]-Dateien zu erstellen, denn die MinGW- und cygwin-Compiler unterstützen dieses Format nicht. Das ELF-Format bietet gegenüber dem PE-Format von Windows den Vorteil, dass es weniger Sonderbehandlung und Workarounds bei der Entwicklung eines Betriebssystems benötigt. Die Verwendung eines Cross-Compilers bietet | + | Für Windows wird ein [[Cross-Compiler]] benötigt, um [[ELF]]-Dateien zu erstellen, denn die MinGW- und cygwin-Compiler unterstützen dieses Format nicht. Das ELF-Format bietet gegenüber dem PE-Format von Windows den Vorteil, dass es weniger Sonderbehandlung und Workarounds bei der Entwicklung eines Betriebssystems benötigt. Die Verwendung eines Cross-Compilers bietet darüber hinaus mehr Kontrolle über den Ablauf des Kompiliervorgangs. |
Dieser Artikel soll eine kleine Anleitung sein, wie man einen vorkompilierten [[GCC]] unter Windows so installiert, dass man damit [[týndur]] kompilieren kann. Allerdings ist der verwendete Compiler nicht auf ein bestimmtes System beschränkt, sondern erzeugt Dateien für das allgemeine Target ''i586-elf''. Es sollte also kein Problem sein, diesen Compiler für ein anderes OS einzusetzen. | Dieser Artikel soll eine kleine Anleitung sein, wie man einen vorkompilierten [[GCC]] unter Windows so installiert, dass man damit [[týndur]] kompilieren kann. Allerdings ist der verwendete Compiler nicht auf ein bestimmtes System beschränkt, sondern erzeugt Dateien für das allgemeine Target ''i586-elf''. Es sollte also kein Problem sein, diesen Compiler für ein anderes OS einzusetzen. | ||
| Zeile 10: | Zeile 10: | ||
==Installation== | ==Installation== | ||
| − | Im Prinzip reicht es das Archiv zu entpacken (z.B. nach C:\crosstools), und in die PATH-Variable das Verzeichnis C:\crosstools\bin einzutragen. Alle Programme haben dann das Präfix "i586-elf-". Zum Beispiel der C-Compiler | + | Im Prinzip reicht es, das Archiv zu entpacken (z.B. nach C:\crosstools), und in die PATH-Variable das Verzeichnis C:\crosstools\bin einzutragen. Alle Programme haben dann das Präfix "i586-elf-". Zum Beispiel kann der C-Compiler mit ''i586-elf-gcc'' aufgerufen werden. |
týndur erwartet, dass dieses Präfix in der ''config.sh'' eingetragen wird, damit die Makefiles den Compiler finden. Dazu muss die Variable ''COMPILER_PREFIX_I386'' in Zeile 3 mittels ''COMPILER_PREFIX_I386=i586-elf-'' entsprechend gesetzt werden. | týndur erwartet, dass dieses Präfix in der ''config.sh'' eingetragen wird, damit die Makefiles den Compiler finden. Dazu muss die Variable ''COMPILER_PREFIX_I386'' in Zeile 3 mittels ''COMPILER_PREFIX_I386=i586-elf-'' entsprechend gesetzt werden. | ||
| Zeile 17: | Zeile 17: | ||
===MSYS einrichten=== | ===MSYS einrichten=== | ||
| − | Für weitere Werkzeuge wie make, bash | + | Für weitere Werkzeuge wie make, bash usw. wird wie bei MinGW die MSYS-Umgebung benötigt. Wenn MSYS bereits installiert ist, kann es problemlos weiter verwendet werden. In der Regel bedeutet das, dass das MSYS-Verzeichnis (Standard C:\msys\bin) ebenfalls in die PATH-Variable eingetragen werden muss. |
Wenn bisher noch kein MinGW installiert war, ist vermutlich auch MSYS noch nicht eingerichtet. MSYS kann auf der [http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=24963 SourceForge-Seite von MinGW] heruntergeladen werden. Die Setup-Datei hat einen Namen in der Form MSYS-1.0.xx.exe, und muss nach dem Download einfach abgearbeitet werden. Um MSYS zu verwenden, muss dann das bin-Verzeichnis ebenfalls in die PATH-Umgebungsvariable eingetragen werden. | Wenn bisher noch kein MinGW installiert war, ist vermutlich auch MSYS noch nicht eingerichtet. MSYS kann auf der [http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=24963 SourceForge-Seite von MinGW] heruntergeladen werden. Die Setup-Datei hat einen Namen in der Form MSYS-1.0.xx.exe, und muss nach dem Download einfach abgearbeitet werden. Um MSYS zu verwenden, muss dann das bin-Verzeichnis ebenfalls in die PATH-Umgebungsvariable eingetragen werden. | ||
| Zeile 25: | Zeile 25: | ||
==Cross-Compiler Kommandozeile== | ==Cross-Compiler Kommandozeile== | ||
| − | Ich verwende für týndur eine Batch-Datei, die mir Umgebung einrichtet. Sie richtet die PATH-Variable ein, und startet die Kommandozeile. Zum Beispiel kann sie so aussehen: | + | Ich verwende für týndur eine Batch-Datei, die mir die Umgebung einrichtet. Sie richtet die PATH-Variable ein, und startet die Kommandozeile. Zum Beispiel kann sie so aussehen: |
SET PATH=C:\msys\bin;C:\crosstools\i586-elf\bin;C:\Programme\NASM;%PATH% | SET PATH=C:\msys\bin;C:\crosstools\i586-elf\bin;C:\Programme\NASM;%PATH% | ||
cmd /k cls | cmd /k cls | ||
| − | Diese Datei kopiere ich mir in das Wurzelverzeichnis des Quelltextbaums von týndur und starte sie. Durch die Eingabe von make sollte dann týndur vollständig kompilieren. | + | Diese Datei kopiere ich mir in das Wurzelverzeichnis des Quelltextbaums von týndur und starte sie. Durch die Eingabe von ''make'' sollte dann týndur vollständig kompilieren. |
==Feedback== | ==Feedback== | ||
| Zeile 37: | Zeile 37: | ||
==Probleme== | ==Probleme== | ||
===gcc: CreateProcess: No such file or directory=== | ===gcc: CreateProcess: No such file or directory=== | ||
| − | *Die beste Lösung dafür ist nicht gcc.exe und die anderen Programme im Verzeichnis i586-elf\bin zu benutzen, sondern die i586-elf-gcc.exe und so weiter im Verzeichnis bin. | + | *Die beste Lösung dafür ist, nicht gcc.exe und die anderen Programme im Verzeichnis i586-elf\bin zu benutzen, sondern die i586-elf-gcc.exe und so weiter im Verzeichnis bin. |
*Alternative: Dieser Fehler tritt auf, weil der gcc die Datei cc1.exe nicht finden kann. Man könnte diese (und cc1plus.exe und collect2.exe) als Workaround einfach von libexec\gcc\i586-elf\4.4.0 nach i586-elf\bin kopieren. Das sorgt allerdings unter Umständen für weitere Probleme, wenn man die mitgelieferte Bibliotheken nutzen will, siehe z.B. nächstes Problem. | *Alternative: Dieser Fehler tritt auf, weil der gcc die Datei cc1.exe nicht finden kann. Man könnte diese (und cc1plus.exe und collect2.exe) als Workaround einfach von libexec\gcc\i586-elf\4.4.0 nach i586-elf\bin kopieren. Das sorgt allerdings unter Umständen für weitere Probleme, wenn man die mitgelieferte Bibliotheken nutzen will, siehe z.B. nächstes Problem. | ||
===error: no include path in which to search for stdio.h (oder andere .h)=== | ===error: no include path in which to search for stdio.h (oder andere .h)=== | ||
Eins vorweg: Die Verwendung der mitgelieferten Bibliotheken ist etwas tricky, weil dieser Compiler für das generische target i586-elf und nicht für ein bestimmtes Betriebssystem kompiliert wurde. Für alle Funktionen fehlen deswegen die Systemaufrufe, die die eigentliche Arbeit machen. Das heißt die meisten Standardfunktionen machen entweder nichts, oder bringen den Kernel/das Programm zum Absturz. | Eins vorweg: Die Verwendung der mitgelieferten Bibliotheken ist etwas tricky, weil dieser Compiler für das generische target i586-elf und nicht für ein bestimmtes Betriebssystem kompiliert wurde. Für alle Funktionen fehlen deswegen die Systemaufrufe, die die eigentliche Arbeit machen. Das heißt die meisten Standardfunktionen machen entweder nichts, oder bringen den Kernel/das Programm zum Absturz. | ||
| − | *Die Lösung dafür ist nicht gcc.exe und die anderen Programme im Verzeichnis i586-elf\bin zu benutzen, sondern die i586-elf-gcc.exe und so weiter im Verzeichnis bin. | + | *Die Lösung dafür ist, nicht gcc.exe und die anderen Programme im Verzeichnis i586-elf\bin zu benutzen, sondern die i586-elf-gcc.exe und so weiter im Verzeichnis bin. |
===crt0.o: No such file or directory=== | ===crt0.o: No such file or directory=== | ||
Dieser Compiler wurde für das generische Target i586-elf und nicht für ein bestimmtes Betriebssystem kompiliert. Weil crt0.o für jedes Betriebssystem anders ist, ist diese nicht mitgeliefert. | Dieser Compiler wurde für das generische Target i586-elf und nicht für ein bestimmtes Betriebssystem kompiliert. Weil crt0.o für jedes Betriebssystem anders ist, ist diese nicht mitgeliefert. | ||