Hi Leute, wenn ich jetzt ein c++-Programm mit gcc übersetze, implementiert der dann auch Routinen in das Programm rein, die den Speicher für den Stack selbst allokieren oder muss das vom Betriebssystem übernommen? Und ich hab mal gelesen, dass eigentlich gar nicht die main()-Funktion zuerst aufgerufen wird, sondern eine andere kleine, die eben irgendwelche Aufgaben, ich glaube z.B. globale Variablenzuweisung und so etwas macht und die dann im Anschluß die eigentlich main() aufruft. Stimmt das und wenn ja, wie kann man diese Funktion verändern? philipp
Hi, Am Don, 2004-01-22 um 18.19 schrieb Michael Wenger: Hi Philipp!
Das sind wirklich sehr interessante Fragen. Das find ich auch!
gcc-Newsgroup besser aufgehoben wären, da sie doch sehr gcc-spezifisch sind. Naja, ich hab eigentlich gcc nur genommen, weil er ja Quasistandard auf Linux ist. Betrifft denk ich auch alle anderen. Trotzdem warte ich gespannt auf die Antworten in dieser Mailing-Liste ;-)
Gruß, Michael
P.S.: Warum interessiert dich das eigentlich? Ich habe solche Kniffe noch nicht gebraucht, um in C++ zu programmieren. Ganz einfach. Hab mich mal zum Spaß aufgemacht ein Betriebssystem zu
Aber ich glaube, dass diese Fragen in einer gcc-Mailingliste bzw. programmieren, nur um da mal nen Einblick zu bekommen. Und da sind solche Sachen dann doch schnell interessant. philipp P.S.: Antworte doch bitte der ganzen Liste.
Hi Philipp! Philipp Otte schrieb:
Am Don, 2004-01-22 um 18.19 schrieb Michael Wenger:
P.S.: Warum interessiert dich das eigentlich? Ich habe solche Kniffe noch nicht gebraucht, um in C++ zu programmieren.
Ganz einfach. Hab mich mal zum Spaß aufgemacht ein Betriebssystem zu programmieren, nur um da mal nen Einblick zu bekommen. Und da sind solche Sachen dann doch schnell interessant.
Da fällt mir spontan dieser Link ein: http://www.netzmafia.de/skripten/unix/unix10.html#10.2 Hast wohl gute Chancen, etwas besseres als UNIX und C auf Beine zu stellen *g*.
P.S.: Antworte doch bitte der ganzen Liste.
Sorry, war ein Versehen. Habs nachgeholt. Gruß, Michael
Hi Philipp! Das sind wirklich sehr interessante Fragen. Aber ich glaube, dass diese Fragen in einer gcc-Mailingliste bzw. gcc-Newsgroup besser aufgehoben wären, da sie doch sehr gcc-spezifisch sind. Trotzdem warte ich gespannt auf die Antworten in dieser Mailing-Liste ;-) Gruß, Michael P.S.: Warum interessiert dich das eigentlich? Ich habe solche Kniffe noch nicht gebraucht, um in C++ zu programmieren.
On Thu, 2004-01-22 at 17:17, Philipp Otte wrote:
Hi Leute, wenn ich jetzt ein c++-Programm mit gcc übersetze, implementiert der dann auch Routinen in das Programm rein, die den Speicher für den Stack selbst allokieren oder muss das vom Betriebssystem übernommen? Diese Frage verstehe ich nicht.
Und ich hab mal gelesen, dass eigentlich gar nicht die main()-Funktion zuerst aufgerufen wird, So ist es. Etwas vereinfacht und sehr allgemein ausgedrückt, wird beim Start eines Programmes ein Startup-Code abgearbeitet, der diverse Vorgänge auslöst, an deren _Ende_ main() aufgerufen wird.
Was dabei im Detail abläuft, kann relativ komplex sein (Das ist es unter x86-Linux auch) und ist hochgradig von der Architektur, vom OS, vom Compiler und von der verwendeten Programmiersprache abhängig.
sondern eine andere kleine, die eben irgendwelche Aufgaben, ich glaube z.B. globale Variablenzuweisung und so etwas macht und die dann im Anschluß die eigentlich main() aufruft.
Nachdem Du aber von C++ und globalen Variablen sprachst, vermute ich dass Du Dich eigentlich auf die Constructor/Destructor-Listen/Arrays (Im gcc-Jargon: ctors/dtors) beziehst. Diese werden vom Compiler angelegt, und vom Startup-Code beim Start von C++Programen abgearbeitet, um statische, globable Variablen, die Konstruktoren verwenden, zu initialisieren (Statische, globale C-Variablen verwenden keine Konstruktoren und werden zum Zeitpunkt der Übersetzung angelegt). Mit dem Programm-Stack hat das allerdings nichts zu tun.
Stimmt das und wenn ja, wie kann man diese Funktion verändern? Wozu? Was hast Du vor? Es gäbe einige Möglichkeiten dort einzugreifen, aber alle auf sehr niedriger Ebene, die ehe in die Rubrik "Schmutzige Tricks" fallen. Ein "normales Program" hat dort normalerweise nichts verloren und ein "normaler Programmier" will dort normalerweise auch nicht hin ;)
Ralf
Hi, Am Fre, 2004-01-23 um 19.45 schrieb Ralf Corsepius:
On Thu, 2004-01-22 at 17:17, Philipp Otte wrote:
Hi Leute, wenn ich jetzt ein c++-Programm mit gcc ÃŒbersetze, implementiert der dann auch Routinen in das Programm rein, die den Speicher fÃŒr den Stack selbst allokieren oder muss das vom Betriebssystem ÃŒbernommen? Diese Frage verstehe ich nicht. Also vielleicht ist das verständlicher: Baut das Betriebssystem den Stack für ein Programm oder erledigt das auch diese startup-Funktion, die vor main() aufgerufen wird?
Und ich hab mal gelesen, dass eigentlich gar nicht die main()-Funktion zuerst aufgerufen wird, So ist es. Etwas vereinfacht und sehr allgemein ausgedrÌckt, wird beim Start eines Programmes ein Startup-Code abgearbeitet, der diverse VorgÀnge auslöst, an deren _Ende_ main() aufgerufen wird.
Was dabei im Detail ablÀuft, kann relativ komplex sein (Das ist es unter x86-Linux auch) und ist hochgradig von der Architektur, vom OS, vom Compiler und von der verwendeten Programmiersprache abhÀngig. Aber dieser Code wird direkt vom Compiler und nicht erst vom OS implementiert, oder?
sondern eine andere kleine, die eben irgendwelche Aufgaben, ich glaube z.B. globale Variablenzuweisung und so etwas macht und die dann im Anschluà die eigentlich main() aufruft.
Nachdem Du aber von C++ und globalen Variablen sprachst, vermute ich dass Du Dich eigentlich auf die Constructor/Destructor-Listen/Arrays (Im gcc-Jargon: ctors/dtors) beziehst. Ja gut, aber das macht jetzt nicht so den Unterschied.
Diese werden vom Compiler angelegt, und vom Startup-Code beim Start von C++Programen abgearbeitet, um statische, globable Variablen, die Konstruktoren verwenden, zu initialisieren (Statische, globale C-Variablen verwenden keine Konstruktoren und werden zum Zeitpunkt der Ãbersetzung angelegt).
Mit dem Programm-Stack hat das allerdings nichts zu tun. Wie wird der Stack denn angelegt?
Stimmt das und wenn ja, wie kann man diese Funktion verÀndern? Wozu? Was hast Du vor? Ich versuche, um ein etwas besseres Verständnis für den PC und das OS zu bekommen. Darum versuch ich ein wirkliches LowLevel-System zu schreiben. Es gÀbe einige Möglichkeiten dort einzugreifen, aber alle auf sehr niedriger Ebene, die ehe in die Rubrik "Schmutzige Tricks" fallen. Ein "normales Program" hat dort normalerweise nichts verloren und ein "normaler Programmier" will dort normalerweise auch nicht hin ;) Und wie kommt man dahin? Wie kann man da eingreifen?
Ralf philipp
Philipp Otte schrieb:
[...] Also vielleicht ist das verständlicher: Baut das Betriebssystem den Stack für ein Programm oder erledigt das auch diese startup-Funktion, die vor main() aufgerufen wird?
OK, ich rate mal mit und behaupte: Der Speicher für den Stack wird vom Betriebssystem beim Erzeugen des Prozesses reserviert, unter Unix vermutlich beim fork(). Der Code zum Anlegen von Objekten auf dem Stack wird, zumindest bei IA32, vom Compiler generiert. Bei RISC-Prozessoren mag das anders sein. Der Startup-Code ist zur Aufbereitung der Prozeß-Umgebung zuständig (main()-Parameter, Environment-Block, ...).
[...] Und wie kommt man dahin? Wie kann man da eingreifen?
Wieder nur geraten: Eine Startup-Routine kannst Du selbst schreiben, und sie in einer Library ablegen. Du mußt sie dann nur den ertellten Programmen hinzulinken. Falls die Einsprungadresse stimmt und main() aufgerufen wird, könnte dann sogar etwas funktionieren. Die Linux Kernel-Sourcen könnten ein ganz guter Ansatzpunkt sein, herauszufinden, wie man das tatsächlich machen kann. Vor kurzem wurde in einem suse-linux-Thread gemutmaßt, daß es auf kernel.org auch noch die Sourcen zum Kernel 0.1 geben müsse - ist wahrscheinlich deutlich weniger komplex, als der aktuelle 2.6er ;-) -- Viele Grüße, Alex
Vielen Dank! Vor allem für den 0.1er Tipp! Mal schaun. Wer könnte denn so einen 0er Kernel noch haben? philipp
Vielen Dank! Vor allem für den 0.1er Tipp! Mal schaun. Wer könnte denn so einen 0er Kernel noch haben?
Einfach mal googeln. Bei Misserfolg bei mailto:majordomo@vger.kernel.org?body=subscribe%20linux-kernel die Kernel-Mailingliste abonnieren und dort nachfragen (zumindest der Meister selbst sollte so ein altes Ding noch in der Vitrine haben). -Alex
* Philipp Otte
Vor allem für den 0.1er Tipp! Mal schaun. Wer könnte denn so einen 0er Kernel noch haben?
gibt's auf dem offiziellen Server, schau mal in suse-linux@suse.com, da gab's in diesem Monat einen Thread dazu. Allerdings kann sich dazwischen auch viel geändert haben. Du kannst den Code auch mal mit -S kompilieren und Dir den generierten Assembler anschauen, da sieht man ziemlich genau, was denn nun gemacht wird. Allerdings hatte ich bisher mit maschinennaher Programmierung noch nicht viel zu tun (kommt erst im nächsten Semester), daher weiß ich auch nicht im Einzelnen, das die Befehle bedeuten. Wird Dir vermutlich ähnlich gehen. Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher -- Albert Einstein
Am Samstag, 24. Januar 2004 00:01 schrieb Philipp Otte:
Vor allem für den 0.1er Tipp! Mal schaun. Wer könnte denn so einen 0er Kernel noch haben?
Hallo, Am Fri, 23 Jan 2004, Alexander Veit schrieb:
Wieder nur geraten: Eine Startup-Routine kannst Du selbst schreiben, und sie in einer Library ablegen. Du mußt sie dann nur den ertellten Programmen hinzulinken. Falls die Einsprungadresse stimmt und main() aufgerufen wird, könnte dann sogar etwas funktionieren.
info ld: Optionen -init, -fini. GCC-Quellen fuer crt{begin,end}.o -> gcc/crtstuff.c u.a. (siehe Makefile.in) Glibc-Quellen fuer crt1.o crtn.o usw. -> csu/ -dnh -- Why use windows, when there's a door?
Moin moin, Am Friday 23 January 2004 19:45 schrieb Ralf Corsepius:
Wozu? Was hast Du vor? Es gäbe einige Möglichkeiten dort einzugreifen, aber alle auf sehr niedriger Ebene, die ehe in die Rubrik "Schmutzige Tricks" fallen. Ein "normales Program" hat dort normalerweise nichts verloren und ein "normaler Programmier" will dort normalerweise auch nicht hin ;)
Wo er Recht hat, hat er Recht! Mal zu Info, erste Link mit google(Suchwort: "gcc & stack") http://www.trapkit.de/papers/gcc_stack_layout_v1_20030830.pdf Bye Andre
participants (8)
-
Alexander Veit
-
Andre Heine
-
Andreas Winkelmann
-
Bernhard Walle
-
David Haller
-
Michael Wenger
-
Philipp Otte
-
Ralf Corsepius