Aufruf von GCC als “cc” im Vergleich zu “gcc”

Lesezeit: 9 Minuten

Benutzeravatar von Dan Moulding
Dan Formen

Mir ist bewusst, dass GCC auf den meisten GNU/Linux-Systemen unter dem Namen „cc“ von der Befehlszeile aufgerufen werden kann (im Gegensatz zu „gcc“). Gibt es einen Unterschied im Verhalten von GCC, wenn es auf die eine oder andere Weise aufgerufen wird?

Ich weiß zum Beispiel, dass das Aufrufen von GCC über den Namen „g++“ anstelle von „gcc“ dazu führt, dass sich GCC anders verhält (es behandelt .c-Dateien als C++-Quelle und Links in der C++-Standardbibliothek). Gibt es einen ähnlichen Unterschied im Verhalten zwischen “gcc” und “cc”?

BEARBEITEN: Keine der bisher eingegangenen Antworten gab a endgültig “ja” oder “nein”, ob sich GCC anders verhält, wenn es auf die eine oder andere Weise aufgerufen wird. Die Idee, in die Quelle einzutauchen, um ihr Verhalten zu überprüfen, führte mich jedoch auf diesen Weg. Basierend auf dem, was ich dort gefunden habe, glaube ich jetzt, dass die Antwort lautet:

Nein. GCC verhält sich gleich, egal ob es über “gcc” oder “cc” aufgerufen wird..

  • Scheint das gleiche zu sein, aa gawk vs. awk, gmake vs. make usw. Ich würde mir verkaufen, dass sie immer gleich sind. Auf Solaris-Systemen habe ich gehört, dass sich make von gmake (gnu make) unterscheidet. Vielleicht gelten auf einigen Systemen ähnliche Dinge für gcc vs. cc.

    – Johannes Schaub – litb

    31. März 2016 um 7:29 Uhr

Benutzeravatar von plinth
Sockel

Zum Grinsen habe ich gerade nachgezeichnet, wie argv[0] wird innerhalb von gcc verwendet (main.c -> top_lev.c -> opts.c -> langhooks.c) und es scheint so argv[0] wird derzeit für nichts anderes als das Geben verwendet malloc etwas zu melden, wenn es fehlschlägt. Es scheint keine Verhaltensänderung zu geben, wenn argv[0] ist alles andere als gcc.

  • Das einzige Problem, das ich damit habe, ist, dass “cc –version” gibt leicht andere Ausgabe von “gcc –version” (es heißt “cc” statt “gcc”). So etwas da muss argv angeschaut werden[0].

    – Dan Formen

    2. Juni 2009 um 15:45 Uhr

  • Ihre Antwort hat mich motiviert, selbst in den Quellcode zu schauen. Ich fand das argv[0] wird “Programmname” zugewiesen, was am Ende ein wenig an andere Funktionen weitergegeben wird (und in der Umgebung gespeichert wird). Obwohl ich keine gemacht habe erschöpfend search, soweit ich sehen kann, wird es immer nur zu Anzeigezwecken verwendet (z. B. in der “–version”-Ausgabe, “usage”-Ausgabe, Fehlermeldungen usw.).

    – Dan Formen

    3. Juni 2009 um 2:24 Uhr

  • Mir ist gerade aufgefallen, dass dies nur zutrifft, wenn cc und gcc dieselbe ausführbare Datei sind. Kann es vorkommen, dass das System unterschiedliche Binärdateien hat? Stellen Sie sich vor, dass cc mit einer Clang-Binärdatei und gcc mit gcc verknüpft werden kann. Ehrliche Frage, keine Ahnung.

    – Johannes Schaub – litb

    31. März 2016 um 7:31 Uhr

Johannes Schaub - Benutzerbild der litb
Johannes Schaub – litb

So sieht es für mich aus cc (Link zu einer alten SUS-Spezifikation) soll die herstellerneutrale Schnittstelle zum Compiler des Systems sein. Es ist als Vermächtnis markiert:

Das c89-Dienstprogramm bietet eine Schnittstelle zum ISO-C-Standard, aber das cc-Dienstprogramm akzeptiert einen nicht spezifizierten Dialekt der C-Sprache: es kann Standard-C, gebräuchliches C oder eine andere Variante sein. Portable C-Programme sollten so geschrieben werden, dass sie dem ISO-C-Standard entsprechen, und mit c89 kompiliert werden.

POSIX hat ein Dienstprogramm namens c99 was ich glaube, ist der Nachfolger von c89. Es sagt

Das Dienstprogramm c99 basiert auf dem Dienstprogramm c89, das ursprünglich im Standard ISO POSIX-2:1993 eingeführt wurde. Einige der Änderungen von c89 umfassen die Änderung des Inhalts des Abschnitts “Standardbibliotheken”, um neue Kopfzeilen und Optionen zu berücksichtigen; B. zum Operanden -l rt hinzugefügt, und der Trace-Operand -l für die Ablaufverfolgungsfunktionen hinzugefügt.

Ich bin mit all diesen verschiedenen Standards nicht wirklich vertraut, aber es sieht so aus, als ob das neuere SUSv3 (POSIX:2004) und die noch neuere POSIX:2008 (scheint noch keine SUS-Nummer zu haben) Geben Sie kein aufgerufenes Dienstprogramm an cc mehr, aber nur das Dienstprogramm genannt c99. Übrigens, mein Linux-System (Arch_Linux) enthält eine Manpage von c99 aber nicht c89enthält aber nur ein Dienstprogramm namens ccdoch keins c89 Noch c99. Viel Verwirrung drin 🙂

  • Interessante Verbindung. Jemand sollte die Leute von GNU Make wahrscheinlich darüber informieren, da es immer noch “cc” als Standard aufrufen wird, wenn Sie ${CC} nicht überschreiben. Anscheinend sollten sie standardmäßig eines der anderen Dienstprogramme verwenden. Es scheint, dass c89 sollte das bevorzugte Dienstprogramm gemäß dem Standard sein.

    – Dan Formen

    2. Juni 2009 um 16:01 Uhr

  • OTOH, da das 1997 geschrieben wurde, sollte heutzutage vielleicht das bevorzugte Dienstprogramm c99 sein.

    – Dan Formen

    2. Juni 2009 um 16:03 Uhr

  • Ja, SUSv3 enthält c89 nicht mehr. nur die alte, auf die ich verlinkt habe, empfahl es (SUSv2)

    – Johannes Schaub – litb

    3. Juni 2009 um 19:38 Uhr

Auf meinem Mac aus man gcc:

In Apples Version von GCC sind sowohl cc als auch gcc eigentlich symbolische Links zu einem Compiler namens gcc-version. Ebenso sind c++ und g++ Links zu einem Compiler namens g++-version.

Basierend darauf würde ich annehmen, dass sich cc und gcc gleich verhalten.

  • In der Unix-Welt ist es üblich, mehrere Links auf dieselbe ausführbare Datei zu setzen, und es ändert einige Standardwerte entsprechend dem Namen, der beim Aufruf verwendet wurde.

    – Javier

    2. Juni 2009 um 14:57 Uhr

  • woah und ein Downvote ohne Erklärung – sehr hilfreich … vielleicht hat ihnen etwas nicht gefallen?

    – stefanB

    2. Juni 2009 um 15:25 Uhr

  • Vielleicht wissen sie nicht, dass Mac OS X ein vollständig Posix-kompatibles Unix-System ist

    – stefanB

    4. Juni 2009 um 0:44 Uhr

  • Nein, vielleicht erwägen sie, die folgende logische Kette zu verwechseln: “symlinked to the same executable -> same behavior”. Beispielsweise können alle Ihre grundlegenden Befehlszeilen-Dienstprogramme auf einem minimalen System mit busybox verknüpft werden, funktionieren jedoch als völlig separate Dienstprogramme

    – Efraim

    31. Juli 2009 um 7:33 Uhr

Benutzeravatar von N 1.1
N 1.1

Ich hatte heute die gleichen Zweifel und habe versucht, es selbst zu finden:

$ which cc
 /usr/bin/ccc

$file /usr/bin/cc
 /usr/bin/cc: symbolic link to '/etc/alternatives/cc'

$file /etc/alternatives/cc
 /etc/alternatives/cc: symbolic link to '/usr/bin/gcc'

$which gcc
 /usr/bin/gcc

Also im Prinzip cc verweist auf gcc.

Sie können auch mit überprüfen cc -v und gcc -v. Wenn sie dasselbe ausdrucken, bedeutet das, dass sie genau gleich sind.

Auch wenn gcc unabhängig von argv gleich arbeitet[0]funktioniert nicht jede Software gleich, unabhängig davon, welchen Sie als Compiler angeben.

Beim Erstellen von zlib 1.2.5 auf RHEL 5.5 (gcc 4.1.2):

$ md5sum $(which cc)
69a67d3029b8ad50d41abab8d778e799  /usr/bin/cc
$ md5sum $(which gcc)
69a67d3029b8ad50d41abab8d778e799  /usr/bin/gcc

Aber:

$ CC=$(which cc) ./configure
Checking for shared library support...
Tested /usr/bin/cc -w -c -O ztest20557.c
Tested cc -shared -O -o ztest20557.so ztest20557.o
/usr/bin/ld: ztest20557.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
ztest20557.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
No shared library support; try without defining CC and CFLAGS
Building static library libz.a version 1.2.5 with /usr/bin/cc.
Checking for off64_t... Yes.
Checking for fseeko... Yes.
Checking for unistd.h... Yes.
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
Checking for vsnprintf() in stdio.h... Yes.
Checking for return value of vsnprintf()... Yes.

Und:

$ CC=$(which gcc) ./configure
Checking for shared library support...
Building shared library libz.so.1.2.5 with /usr/bin/gcc.
Checking for off64_t... Yes.
Checking for fseeko... Yes.
Checking for unistd.h... Yes.
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
Checking for vsnprintf() in stdio.h... Yes.
Checking for return value of vsnprintf()... Yes.
Checking for attribute(visibility) support... Yes.

Das Konfigurationsskript berücksichtigt nicht die Möglichkeit, dass cc auf einem Linux-System gcc sein könnte. Seien Sie also vorsichtig, wie weit Sie mit Ihren Annahmen gehen.

  • Das versteht sich von selbst. Der Compiler verhält sich nicht anders. Dies ist ein Manko der configure Skript. Das weiß das Skript gcc kann Shared Libraries generieren und weiß das gcc braucht die -fPIC Option beim Kompilieren gemeinsam genutzter Bibliotheken unter Linux. Wenn der Compiler nicht ist gccdann configure versucht zu testen, ob der Compiler gemeinsam genutzte Bibliotheken generieren kann. Aber Es kann nicht erraten, welche Compiler-Flags für einen Compiler benötigt werden, den es nicht kennt, also müssen Sie als Benutzer sie bereitstellen. Sie müssen die erforderlichen Flags in der Befehlszeile bereitstellen (z. B. via CFLAGS=-fPIC).

    – Dan Formen

    18. Dezember 2010 um 17:11 Uhr

  • Dies war eher als zusätzliche Warnung denn als Antwort gedacht. Der Aufruf von gcc als cc im obigen Fall würde nicht dazu führen, dass es anders funktioniert, aber die aufrufende Software funktionierte auf eine nicht intuitive Weise, die den Anschein eines anderen Verhaltens verursachte.

    – ednos

    11. Januar 2011 um 20:43 Uhr

Benutzeravatar von ismail
ismail

cc ist nur die UNIX-Art, den Compiler aufzurufen, er funktioniert auf allen Unices.

  • Das versteht sich von selbst. Der Compiler verhält sich nicht anders. Dies ist ein Manko der configure Skript. Das weiß das Skript gcc kann Shared Libraries generieren und weiß das gcc braucht die -fPIC Option beim Kompilieren gemeinsam genutzter Bibliotheken unter Linux. Wenn der Compiler nicht ist gccdann configure versucht zu testen, ob der Compiler gemeinsam genutzte Bibliotheken generieren kann. Aber Es kann nicht erraten, welche Compiler-Flags für einen Compiler benötigt werden, den es nicht kennt, also müssen Sie als Benutzer sie bereitstellen. Sie müssen die erforderlichen Flags in der Befehlszeile bereitstellen (z. B. via CFLAGS=-fPIC).

    – Dan Formen

    18. Dezember 2010 um 17:11 Uhr

  • Dies war eher als zusätzliche Warnung denn als Antwort gedacht. Der Aufruf von gcc als cc im obigen Fall würde nicht dazu führen, dass es anders funktioniert, aber die aufrufende Software funktionierte auf eine nicht intuitive Weise, die den Anschein eines anderen Verhaltens verursachte.

    – ednos

    11. Januar 2011 um 20:43 Uhr

Benutzeravatar von clockwork0rk
Uhrwerk

Dieser Thread ist vielleicht alt, aber ich möchte etwas hinzufügen (vielleicht findet ihn jemand in der Zukunft).

Wenn Sie dieses Programm kompiliert haben

#include <stdio.h>
#include <stdlib.h>

void
myFunction(char *args)
{
   char buff1[12];
   char buff2[4] = "ABC";

   strcpy(buff1,args);

   printf("Inhalt Buffer2: %s",buff2);

}

int main(int argc, char *argv[])
{

   if(argc > 1)
   {
      myFunction(argv[1]);
   }
   else
      printf("no arguments sir daimler benz");

   getchar();

   return 0;
}

mit “gcc”, und Sie übergeben “AAAAAAAAAAAAAAAAAAAAAA” als Argument, es wird nicht in Puffer2 überlaufen, während es TUT, wenn Sie mit “cc” kompilieren, was für mich ein Hinweis darauf ist, dass Sie “gcc” verwenden, die Speicherverwaltung funktioniert anders, vielleicht durch Leerzeichen zwischen den Speichersegmenten der Felder buff1 & buff2 ?

Vielleicht kann hier jemand mit mehr Erfahrung Licht ins Dunkel bringen.

  • Ich habe dies versucht (auf gcc Version 4.8.4 (Ubuntu 4.8.4-2ubuntu1 ~ 14.04)), mit Stack Protector aus und an und beide enden mit beiden Segmentierungsfehler oder Stapelzertrümmerung erkannt, am Ende ist cc ein Link zu /etc/alternatives/cc und das ist ein Link zu /usr/bin/gcc. Wie @abcoep sagt, unterscheiden sich cc und gcc nur bei der Tab-Vervollständigung (soweit ich das untersuchen konnte).

    – Kyslik

    17. Februar 2017 um 18:30 Uhr

1416180cookie-checkAufruf von GCC als “cc” im Vergleich zu “gcc”

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy