Relation entre cc1 et gcc?

23

J'essaie d'installer Ruby dans mon répertoire personnel sur un serveur Linux (sans accès root), ce qui bien sûr nécessite d'être utilisé gcc. La chose la plus proche que je peux trouver est un répertoire de ce nom qui (si vous allez assez loin) contient 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

Le fait que CC1 redirige vers GCC sur Wikipédia semble impliquer quelque chose de proche de l'identité, mais il n'y a aucune autre mention de CC1 sur la page GCC à part la note sur la redirection, et Google ne m'a rien donné d'utile, et mes tentatives d'utilisation cc1dans lieu d' gccavoir échoué.

Quelle est exactement la relation entre eux? Et cela me donne-t-il un espoir de compiler Ruby sur cette machine?

iconoclaste
la source

Réponses:

28

GCC a un certain nombre de phases pour sa compilation, et il utilise différentes commandes internes pour effectuer chaque phase. C en particulier est d'abord prétraité avec cpp, puis est compilé en assemblage, assemblé en langage machine, puis lié entre eux.

cc1 est la commande interne qui prend les fichiers de langage C prétraités et les convertit en assembleur. C'est la partie réelle qui compile C. Pour C ++, il y a cc1plus et d'autres commandes internes pour différents langages.

Il existe un livre sur Wikibooks qui explique le processus avec des images .

Malheureusement, cc1 est une commande interne et une seule partie de l'installation, et si c'est tout ce que vous avez, vous ne pourrez pas compiler les choses.

Alan Shutko
la source
2
Le terme usuel est "frontal".
Keith Thompson
1
Êtes-vous sûr qu'il nécessite des fichiers C prétraités? Je semble être en mesure de cc1fichiers avec #includeet #definedirectives
extremeaxe5
10

gccest le nom de la suite ccest juste le compilateur C de cette suite.

le mot ccc'est aussi un nom générique pour n'importe quel compilateur c donné sous les systèmes unix, par exemple il n'est pas rare de trouver une variable d'environnement appelée CCdans un script de construction ou un script de configuration donné, et si vous voulez être pédant, cette variable pointe généralement vers ac compilateur qui n'effectue pas nécessairement la liaison de votre objet compilé, il est généralement utilisé pour faire référence à un compilateur qui compile "juste". ccfrom gccest, cependant, capable de produire un exécutable fini et est donc capable d'effectuer cette dernière étape avec son éditeur de liens aussi.

le mot cc1est souvent utilisé "en interne" ou lors de la lecture de documents GNU ( exemple ), il est également utilisé pour nommer la bibliothèque liée à gcc en fonction du langage ou du compilateur auquel ils appartiennent (dans ce cas, cc1 = appartient au compilateur c).

en fait si vous demandez gccquel est le sens du motcc1

gcc -print-prog-name=cc1

il doit répondre avec le chemin de la bibliothèque pour le compilateur cc, donc vous essayez d'exécuter quelque chose qui est une bibliothèque et non un véritable exécutable.

il est beaucoup plus simple de se souvenir de CC en tant que compilateur c et de tout simplifier, contournez ce cc1, vous n'avez pas besoin de savoir comment les choses fonctionnent en interne, sauf si vous voulez commencer un long voyage.

user2384250
la source
4

Comme d'autres l'ont mentionné, les gccutilisations cc1.

La façon exacte dont les cc1autres sous-programmes comme cppet ldsont appelés est effectuée est déterminée par le format des fichiers de spécifications .

Le fichier de spécifications actuel peut être visualisé avec:

gcc -dumpspecs

La section pertinente semble être:

*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}

Et vous pouvez utiliser votre propre fichier de spécifications avec:

gcc -specs=<specs-file>

Bien sûr, les options de ligne de commande passées à GCC changent indirectement la façon dont les sous-processus sont appelés. Mais la manipulation des fichiers de spécifications vous donne une plus grande flexibilité et vous permet de faire des choses que les options de ligne de commande ne peuvent pas, par exemple /programming/7493620/inhibit-default-library-paths-with-gcc

Vous pouvez observer ce qui est exécuté facilement avec:

gcc -v hello_world.c |& grep cc1

Exemple de sortie:

/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 新疆 改造 中心 法轮功 六四 事件
la source
1

cc1 est à la fois le préprocesseur et le compilateur, dont l'entrée est le code source C et la sortie est le code assembleur.

Vous pouvez voir cc1est l'une des commandes invoquées (la première, en fait) en émettant (syntaxe dépendante de la version):
gcc-8 -v SOMESOURCE.c

flow2k
la source