nufan hat geschrieben:Alles was das Betriebssystem braucht, ist ein "_start" Einstiegspunkt. Im Falle eines mit gcc kompilierten C-Programms wird dieser von crt bereitgestellt. Sinn dahinter ist die Aufbereitung von z.B. argc und argv. Ich kann mir auch gut vorstellen, dass Funktionen wie atexit() von crt abhängig sind.
Genau, so stelle ich mir das auch vor.
Da ich den Build-Prozess von Hand nachbilden will, fehlt mir nun diese Information, weswegen ich mit dem Linker kein brauchbrares Executable hinbekomme. ^^
Unter Ubuntu scheinen das drei Dateien zu sein: crt1, crti und crtn.
Wenn ich die zum Linken dazu nehme, kann ich das Programm linken, wenn ich es allerdings ausführen will schreibt er:
Code: Alles auswählen
xin@cypher:~/try/hworld$ ls -la hworld
-rwxrwxr-x 1 xin xin 7136 Nov 10 22:00 hworld
xin@cypher:~/try/hworld$ ./hworld
bash: ./hworld: Datei oder Verzeichnis nicht gefunden
Da muss ich noch rausfinden, wie und warum das zu stande kommt.
nufan hat geschrieben:Xin hat geschrieben:Muss es nicht irgendwo Startcode geben, den der gcc verlinkt, wenn er ein Executable baut? Und wenn ja, wo finde ich den unter Ubuntu (bzw. Windows)? ^^
Auf meinem Arch Linux-System mit gcc 7.2 werden sogar mehrere crt Dateien verwendet:
Da kommt bei mir nichts raus.
Ich habe die drei jetzt gefunden, in dem ich einfach main start genannt habe und den gcc das habe kompilieren lassen. Mit dem Ergebnis, dass es ein Linkerfehler gebt mit dem Objectfile, wo start bereits definiert wird und so habe ich es dann gefunden.
Aber irgendwas hakt noch, nur das jetzt zu suchen, dafür bin ich jetzt zu müde
mfro hat geschrieben:Wenn Du das mit gcc baust
Das sieht interssant aus, das werde ich mir nochmal genauer geben.
Aktuell bin ich auf der Meeting C++ in Berlin und aktuell eher ziemlich platt.
Aber das erklärt mir mit dem Interrupt jedenfalls schonmal, warum mein Versuch abschmierte... In x86 Asm bin ich noch recht frisch unterwegs und in meiner Zeit vom Amiga endete ein Programm ganz einfach mit dem "ret". Also habe ich den Interrupt so nicht vor Augen gehabt.
mfro hat geschrieben:hast Du das kürzestmögliche "C"-Programm. -nostdlib unterbindet das Einbinden von crt0.o, das Programm beginnt bei _start. Allerdings fehlt dir so die gcc Runtime (möglicherweise muss libgcc.a händisch dazugelinkt werden) und Konstruktoren werden nicht aufgerufen (so was gibt's bei gcc auch in C - __attribute__ __constructor__). Es geht also längst nicht alles, was Du in C gewohnt bist. Aber es ist mal ein Start. Was genau willst Du damit erreichen?
Verstehen und den fehlenden Artikel in start: fertig schreiben. Ich weiß zwar grundsätzlich, wie ein Programm kompiliert wird und wie es geladen wird, aber wenn man dann so einen Artikel schreibt und das ganze nochmal tatsächlich nachvollziehen will, um es anschließend erklären zu können, da lernt man doch wieder einiges dazu.

Seit ich sowas vor 20 Jahren auf dem Amiga gemacht habe, hat sich für mich die Hardware und das OS geändert. Ein paar Dinge sind dann doch anders und die Dokumentation dazu ist überschaubar, weswegen ich das jetzt ja auch nachvollziehen und erklären will.
Und offensichtlich läuft es auf den unterschiedlichen Linux-Versionen auch unterschiedlich, denn unter Nufans Arch Linux findet sich die crt0.o, unter Ubuntu gibt's es sie nicht. Nun da ich weiß, wie sie heißen, habe ich wieder Suchbegriffe für Google
