Kompilieren eines C-Programms mit GCC

 C Programming >> C-Programmierung >  >> Tags >> GCC
Kompilieren eines C-Programms mit GCC

In diesem Artikel haben wir behandelt, wie man ein C-Programm mit dem GCC-Compiler zusammen mit den verschiedenen Phasen wie Vorverarbeitung, Kompilierung, Assemblierung und Verknüpfung kompiliert.

Inhaltsverzeichnis:

  1. Einführung in GCC
  2. Zusammenstellung
  3. Beispielquellcode
  4. Der Kompilierungsprozess (4 Schritte)

Einführung in GCC

GCC ist ein Akronym, das für GNU Compiler Collection steht. GCC ist eine Sammlung von Compilern und Bibliotheken, die Unterstützung für verschiedene Programmiersprachen wie C, C++, Java usw. bieten.

Der GCC-Compiler ist in den meisten Linux-Distributionen enthalten. In diesem Artikel haben wir Ubuntu für alle Beispiele verwendet.
Um zu überprüfen, ob es bereits auf Ihrem System installiert ist, führen Sie den folgenden Befehl aus:

username@hostname:~$ gcc --version

AUSGABE

gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Zusammenstellung

Das Kompilieren eines Programms ist der Prozess der Umwandlung des Quellcodes (von Menschen lesbarer Code) in Maschinensprache, die eine Sprache ist, die der Computer verstehen kann.
Ein Compiler ist ein Computerprogramm, das den in einer höheren Programmiersprache (z. B. C) geschriebenen Quellcode in eine niedrigere Sprache wie Maschinencode übersetzt.

Beispielquellcode

Wir haben Vim als unseren Editor verwendet.
Erstellen Sie eine neue Datei und nennen Sie sie hello.c. Die .c Dateierweiterung zeigt an, dass die Datei Quellcode enthält, der in C geschrieben ist.

username@hostname:~$ vim hello.c

Quellcode

hello.c
  1 
  2 #include <stdio.h>
  3 
  4 int main() {
  5     printf("Hello World!\n");
  6     return 0;
  7 }
  8 

Der Kompilierungsprozess

Der Kompilierungsprozess umfasst die folgenden vier Hauptschritte:

  1. Vorverarbeitung
  2. Kompilieren
  3. Montieren
  4. Verlinkung

Wir haben ein einfaches Hallo-Welt-Programm verwendet, um zu zeigen, wie der Kompilierungsprozess abläuft.

1. Präprozessor

Der Präprozessor führt die folgenden Aufgaben aus:

  • Es entfernt alle Kommentare in der Quelldatei und ersetzt sie durch ein einzelnes Leerzeichen.
  • Es enthält den Code aus den Header-Dateien.
  • Es ersetzt die vordefinierten Makronamen durch ihre Erweiterungen.

Der GCC-Compiler verfügt über mehrere Optionen, die die Kompilierung nach verschiedenen Schritten stoppen können.

Um die Ausgabe der Vorverarbeitungsphase anzuzeigen, können wir den Befehl gcc -E program_name.c verwenden Option wie unten gezeigt.

username@hostname:~$ gcc -E hello.c

Die Ausgabe des Vorprozessors wird an das Terminal gesendet. Führen Sie den folgenden Befehl aus, um die Ausgabe zu speichern:

username@hostname:~$ gcc -E hello.c > hello.i

Die Dateierweiterung .i zeigt an, dass die Datei eine vorverarbeitete Datei ist. Der folgende Code ist Teil der hello.i-Datei.

Um die Datei anzuzeigen, führen Sie Folgendes aus:

username@hostname:~$ vim hello.i

AUSGABE

extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 858 "/usr/include/stdio.h" 3 4
extern int __uflow (FILE *);
extern int __overflow (FILE *, int);
# 873 "/usr/include/stdio.h" 3 4

# 3 "hello.c" 2


# 4 "hello.c"
int main() {
    printf("Hello World");
    return 0;
}

2. Compiler

In dieser Phase nimmt der Compiler die vorverarbeitete Datei und generiert je nach Compiler IR-Code (Intermediate Representation) oder Assembler-Code.

Um den Kompilierungsprozess nach diesem Schritt zu stoppen, können wir den Befehl gcc -S program_name.c verwenden Option wie unten gezeigt.

username@hostname:~$ gcc -S hello.c

Dieser Befehl erstellt ein hello.s Datei, die den Assemblercode enthält.
Um die Datei anzuzeigen, führen Sie Folgendes aus:

username@hostname:~$ vim hello.s

AUSGABE

        .file   "hello.c"
        .text
        .section        .rodata
.LC0:
        .string "Hello World"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        endbr64
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        leaq    .LC0(%rip), %rdi
        movl    $0, %eax
        call    printf@PLT
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8

3. Assembler

In der dritten Stufe übersetzt der Assembler den Assemblercode in ausführbaren Maschinencode.

Um den Kompilierungsprozess nach diesem Schritt zu stoppen, können wir den Befehl gcc -S program_name.c verwenden Option wie unten gezeigt.

username@hostname:~$ gcc -c hello.c

Dieser Befehl erstellt ein hello.o Datei enthält den Maschinencode, der für Menschen nicht lesbar ist.

Um die Datei anzuzeigen, führen Sie Folgendes aus:

username@hostname:~$ vim hello.o

AUSGABE

^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^X^C^@^@^@^@^@^@^@^@^@^@@^@^@^@^@^@@^@^N^@^M^@ó^O^^úUH<89>åH<8d>=^@^@^@^@¸^@^@^@^@è^@^@^@^@¸^@^@^@^@]ÃHello World^@^@GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0^@^@^D^@^@^@^P^@^@^@^E^@^@^@GNU^@^B^@^@À^D^@^@^@^C^@^@^@^@^@^@^@^T^@^@^@^@^@^@^@^AzR^@^Ax^P^A^[^L^G^H<90>^A^@^@^\^@^@^@^\^@^@^@^@^@^@^@ ^@^@^@^@E^N^P<86>^BC^M^FW^L^G^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^D^@ñÿ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^C^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^D^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^E^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^G^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@

4. Linker

Zu den vom Linker ausgeführten Aufgaben gehören:

  • Verknüpfung aller Objektdateien aus den verschiedenen Quelldateien.
  • Verknüpfung von Funktionsaufrufen mit ihren Definitionen. Der Linker kennt die Speicherorte der Funktionsdefinitionen in den statischen oder dynamischen Bibliotheken.

Um den Kompilierungsprozess abzuschließen, haben wir zwei Möglichkeiten:

Option 1

Führen Sie den folgenden Befehl aus:

username@hostname:~$ gcc hello.c

Wenn Sie diesen Befehl ausführen, generiert der Compiler ein ausführbares Programm namens a.out . Um das ausführbare Programm auszuführen, geben Sie den folgenden Befehl ein:

username@hostname:~$ ./a.out

Option 2

Um dem ausführbaren Programm einen anderen Namen zu geben, können wir die Option „-o“ zum gcc-Befehl nach dem Namen der zu kompilierenden Datei hinzufügen, wie unten gezeigt:

username@hostname:~$ gcc hello.c -o helloprogram

Um das ausführbare Programm auszuführen, verwenden Sie den folgenden Befehl:

username@hostname:~$ ./helloprogram

Mit diesem Artikel bei OpenGenus müssen Sie eine starke Vorstellung davon haben, wie man ein C-Programm mit GCC kompiliert.


No