C 4: Mehr über’s Kompilieren
Wie in der Einleitung beschrieben, soll dies ein eher theoretischer Text werden. Jedoch gehört dieses Wissen dazu, um zu verstehen wie C funktioniert. Nur wenn man etwas wirklich versteht und nicht nur auswendig lernt, kann man es auch anwenden. Also nichts wie ‚ran an die Arbeit.
Jedes C-Programm wird als C-Code in einer Text-Datei gespeichert. Diese Textdatei wird dann vom C-Präprozessor bearbeitet. Wie ihr bereits wisst, werden z.B. #include
-Befehle mit der inkludierten Datei ersetzt.
Erst jetzt greift der C-Compiler ein. Dieser kompiliert oder übersetzt den präprozessierten Code in Assembler-Code. Assembler/ASM ist auch eine Programmiersprache, nur sehr viel simpler and hardware-näher als C. Jedes C-Programm wird also automatisch in eine andere Programmiersprache übersetzt – deswegen auch Übersetzer oder Compiler.
Diese ASM-Datei wird jetzt vom Assembler zu Objekt-Code konvertiert. Dies ist jetzt kein für den Menschen lesbarer Code mehr. Öffnet man eine solche Datei in einem Texteditor werden viele lustige Zeichen ausgegeben, die aber in diesem Kontext keinen Sinn ergeben werden.
Diese Objekt-Datei wird von dem Linker mit entsprechend gelinkten Bibliotheken und anderen Objekt-Dateien verlinkt. Dies ist momentan noch nicht so wichtig, aber bei etwas größeren Projekten (ab zwei Dateien) alltäglich.
Dies ist dann die fertige ausführbare Datei, welche vom Betriebssystem-Loader bei Bedarf in den Speicher geladen und ausgeführt werden kann.
Ein Blick in die Manualseite von gcc
verrät uns wie man das praktisch testen kann:
- normal: Präprozessor, Compiler, Assembler, Linker
- -c: Präprozessor, Compiler, Assembler
- -E: Nur Präprozessor
- -S: Präprozessor, Compiler
Wer also den Assembler-Code für unser „Hallo Welt-„Progamm sehen möchte, gibt folgendes in der Konsole ein:
tcr@triton ~ $ gcc -S hallo.c tcr@triton ~ $ ls hallo.c hallo.s tcr@triton ~ $ cat hallo.s |
.file "hallo.c" .section .rodata .LC0: .string "Hallo Welt!" .text .globl main .type main, @function main: [...] Noch viele weiter Zeilen... [...] |