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