Das Folgende ist meine C-Datei:
%Vor%Es enthält nur eine return-Anweisung. Aber wenn ich den Größenbefehl benutze, zeigt er das an Ausgabe wie folgt:
%Vor%Obwohl mein Programm keine globale Variable oder nicht deklarierte Daten enthält. Aber die Ausgabe zeigt Datensegment haben 252 und die BSS haben 8 Bytes. Also, warum ist die Ausgabe so? Was ist 252 und 8 bezieht sich.
Größenbefehl
Sehen Sie sich zuerst die Definition jeder Spalte an:
Wie Blue Moon sagte. Unter Linux beginnt die Ausführung mit dem Aufruf der Funktion _start (). Welche Umgebung wird eingerichtet? Jedes C-Programm hat versteckte "Bibliotheken", die von Ihrem verwendeten Compiler abhängen. Es gibt Einstellungen für globale Parameter, Beenden von Anrufen und nach der vollständigen Konfiguration ruft sie schließlich Ihre main () -Funktion auf. ASFAIK gibt es keine Möglichkeit zu sehen, wie Ihr Code mit der Konfigurations- und _start () - Funktion gekapselt aussieht. Aber ich kann Ihnen zeigen, dass sogar Ihr Code mehr Informationen enthält, als Sie dachten, je näher wir der Hardware sind.
Hinweis:
Geben Sie readelf -a a.out
ein, um zu sehen, wie viele Informationen Ihre ausführende Person wirklich enthält.
Was ist drin?
Vergleichen Sie den Code in Ihrer Quelldatei nicht mit der Größe der ausführbaren Datei, dies hängt vom Betriebssystem, dem Compilator und den verwendeten Bibliotheken ab.
In meinem Beispiel gibt SIZE mit genau dem gleichen Code zurück:
%Vor%Mal sehen was drin ist ...
%Vor%Dies wird den Präprozessor über a.c ausführen, die erste Kompilierung durchführen und dann stoppen, bevor der Assembler ausgeführt wird.
%Vor%Dann schauen Sie sich den Assembler-Code an
%Vor%Der nächste Schritt würde den obigen Code in die 01-Notation umwandeln.
Wie Sie sehen können. Selbst ein einfaches Programm enthält eine komplizierte Bedienung, je näher der Code an der Hardware ist. Ich hoffe ich habe dir erklärt warum die ausführbare Datei größer ist als du gedacht hast. Wenn Sie irgendwelche Zweifel haben, zögern Sie nicht, meinen Beitrag zu kommentieren. Ich werde meine Antwort sofort bearbeiten.
Tags und Links c linux memory-management unix