Beziehung zwischen cc1 und gcc?

23

Ich versuche, Ruby in meinem Home-Verzeichnis auf einem Linux-Server (ohne Root-Zugriff) zu installieren, was natürlich die Verwendung von erfordert gcc. Das nächste, was ich finden kann, ist ein Verzeichnis mit diesem Namen, das (wenn Sie tief genug gehen) enthält cc1:

>: find / -iname gcc 2> /dev/null
/usr/libexec/gcc


>: tree -if /usr/libexec/gcc
/usr/libexec/gcc
/usr/libexec/gcc/x86_64-redhat-linux
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1/cc1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.2 -> 4.1.1

Die Tatsache , dass CC1 Umleitungen GCC auf Wikipedia etwas in der Nähe Identität zu implizieren scheint, aber es gibt keine andere Erwähnung von CC1 auf der GCC - Seite neben der Notiz Umleitung und Googeln hat mir nichts nützlich, und meine Versuche, den Einsatz bekommen cc1in Ort gcchaben versagt.

Was genau ist die Beziehung zwischen ihnen? Und gibt es mir Hoffnung, Ruby auf dieser Maschine zu kompilieren?

Bilderstürmer
quelle

Antworten:

28

GCC hat eine Reihe von Phasen zu seiner Kompilierung und verwendet verschiedene interne Befehle, um jede Phase durchzuführen. Insbesondere C wird zuerst mit cpp vorverarbeitet, dann in Assembler kompiliert, in Maschinensprache zusammengestellt und dann miteinander verknüpft.

cc1 ist der interne Befehl, mit dem vorverarbeitete C-Sprachdateien in Assembly konvertiert werden. Es ist der eigentliche Teil, der C kompiliert. Für C ++ gibt es cc1plus und andere interne Befehle für verschiedene Sprachen.

Es gibt ein Buch über Wikibooks, das den Vorgang mit Bildern erklärt .

Leider ist cc1 ein interner Befehl und nur ein Teil der Installation, und wenn das alles ist, können Sie die Dinge nicht kompilieren.

Alan Shutko
quelle
2
Der übliche Begriff ist "Frontend".
Keith Thompson
1
Sind Sie sicher, dass vorverarbeitete C-Dateien erforderlich sind? Ich scheine in der Lage zu sein, cc1Dateien mit #includeund #defineDirektiven
extremeaxe5
10

gccDer Name der Suite ccist nur der C-Compiler aus dieser Suite.

Das Wort ccist auch ein generischer Name für einen bestimmten c-Compiler unter Unix-Systemen. Es kommt beispielsweise nicht selten vor, dass eine Umgebungsvariable CCin einem bestimmten Erstellungsskript oder Konfigurationsskript aufgerufen wird. Wenn Sie pedantisch sein möchten, verweist diese Variable normalerweise auf ac Compiler, der nicht unbedingt die Verknüpfung Ihres kompilierten Objekts ausführt, wird normalerweise verwendet, um auf einen Compiler zu verweisen, der "nur" kompiliert. ccfrom gcckann jedoch eine fertige ausführbare Datei ausgeben, sodass dieser letzte Schritt auch mit dem Linker ausgeführt werden kann.

Das Wort cc1wird oft "intern" oder beim Lesen von GNU-Dokumenten ( Beispiel ) verwendet. Es wird auch verwendet, um gcc-bezogene Bibliotheken nach der Sprache oder dem Compiler zu benennen, zu dem sie gehören (in diesem Fall gehört cc1 = zum c-Compiler).

tatsächlich, wenn Sie fragen, gccwas die Bedeutung des Wortes istcc1

gcc -print-prog-name=cc1

Es sollte mit dem Pfad für die Bibliothek für den CC-Compiler antworten, sodass Sie versuchen, etwas auszuführen, das eine Bibliothek und keine echte ausführbare Datei ist.

Es ist viel einfacher, sich CC als C-Compiler zu merken und alles zu vereinfachen. Umgehen Sie diesen CC1. Sie müssen nicht wissen, wie die Dinge intern funktionieren, es sei denn, Sie möchten eine lange Reise beginnen.

user2384250
quelle
4

Wie bereits erwähnt, gccverwendet cc1.

Die genaue Art cc1und Weise , wie cppund wie andere Unterprogramme ldaufgerufen werden, wird durch das Format der Spezifikationsdateien bestimmt .

Die aktuelle Spezifikationsdatei kann angezeigt werden mit:

gcc -dumpspecs

Der relevante Abschnitt scheint zu sein:

*cc1_options:
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %{!iplugindir*:%{fplugin*:%:find-plugindir()}} %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*} %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)}  %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}}  %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{Qy:} %{-help:--help} %{-target-help:--target-help} %{-version:--version} %{-help=*:--help=%*} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{coverage:-fprofile-arcs -ftest-coverage}

Und Sie können Ihre eigene Spezifikationsdatei verwenden mit:

gcc -specs=<specs-file>

Natürlich ändern Befehlszeilenoptionen, die an GCC übergeben werden, indirekt den Aufruf der Unterprozesse. Das Manipulieren von Spezifikationsdateien bietet Ihnen jedoch mehr Flexibilität und ermöglicht Ihnen Aktionen, die mit Befehlszeilenoptionen nicht möglich sind, z. B. /programming/7493620/inhibit-default-library-paths-with-gcc

Sie können beobachten, was einfach läuft mit:

gcc -v hello_world.c |& grep cc1

Beispielausgabe:

/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch x86_64-linux-gnu hello_world.c -quiet -dumpbase hello_world.c -mtune=generic -march=x86-64 -auxbase hello_world -version -fstack-protector -Wformat -Wformat-security -o /tmp/ccvcVNAX.s
Ciro Santilli ist ein Schauspieler
quelle
1

cc1 ist sowohl der Präprozessor als auch der Compiler, dessen Eingabe C-Quellcode und dessen Ausgabe Assembler-Code ist.

Sie können sehen, dass cc1einer der Befehle (der erste) durch Ausgabe aufgerufen wird (Syntax abhängig von der Version):
gcc-8 -v SOMESOURCE.c

flow2k
quelle