Relação entre cc1 e gcc?

22

Estou tentando instalar o Ruby no meu diretório home em um servidor Linux (sem acesso root), o que obviamente requer o uso de gcc . A coisa mais próxima que posso encontrar é um diretório com esse nome que (se você for fundo o suficiente) contém 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

O fato de CC1 redirecionar para o GCC na Wikipédia parece implicar algo próximo da identidade, mas não há outra menção a CC1 na página do GCC, além da nota sobre o redirecionamento, e o Googling não me deu nada de útil, e minhas tentativas de usar cc1 no lugar de gcc falharam.

Qual é exatamente a relação entre eles? E isso me oferece alguma esperança de compilar o Ruby nesta máquina?

    
por iconoclast 31.05.2013 / 16:17

4 respostas

27

O GCC tem várias fases em sua compilação e usa diferentes comandos internos para executar cada fase. C, em particular, é primeiro pré-processado com cpp, depois é compilado em assembly, montado em linguagem de máquina e, em seguida, vinculado.

cc1 é o comando interno que recebe arquivos em linguagem C pré-processados e os converte em assembly. É a parte real que compila C. Para C ++, há cc1plus e outros comandos internos para diferentes idiomas.

Existe um livro sobre Wikilivros que explica o processo com imagens .

Infelizmente, cc1 é um comando interno e apenas uma parte da instalação, e se isso é tudo o que você tem, você não poderá compilar as coisas.

    
por 31.05.2013 / 16:49
9

gcc é o nome da suíte cc é apenas o compilador C desta suíte.

a palavra cc também é um nome genérico para qualquer compilador c em sistemas unix, por exemplo, não é raro encontrar uma variável de ambiente chamada CC em um determinado script de construção ou script de configuração, e se você quiser Para ser pedante, essa variável geralmente aponta para um compilador AC que não necessariamente realiza a vinculação de seu objeto compilado, geralmente é usado para se referir a um compilador que "apenas" compila. cc de gcc é, no entanto, capaz de produzir um executável finalizado, portanto, é capaz de realizar essa etapa final com seu vinculador também.

a palavra cc1 é muitas vezes usada "internamente" ou ao ler documentos do GNU ( exemplo ), também é usado para nomear bibliotecas relacionadas ao gcc com base em qual idioma ou compilador eles pertencem (neste caso, cc1 = pertence ao compilador c).

de fato, se você perguntar a gcc qual é o significado da palavra cc1

gcc -print-prog-name=cc1

ele deve responder com o caminho da biblioteca para o compilador cc, então você está tentando executar algo que é uma biblioteca e não um executável real.

é muito mais simples lembrar CC como compilador e simplificar tudo, ignorar este cc1, você não precisa saber como as coisas funcionam internamente a menos que você queira iniciar uma longa jornada.

    
por 31.05.2013 / 16:52
2

Como outros mencionaram, gcc usa cc1 .

A maneira exata na qual cc1 e outros subprogramas como cpp e ld são chamados é feita é determinada pelo espec files format.

O arquivo de especificação atual pode ser visualizado com:

gcc -dumpspecs

A seção relevante parece ser:

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

E você pode usar seu próprio arquivo de especificação com:

gcc -specs=<specs-file>

É claro que as opções de linha de comando passadas para o GCC alteram indiretamente como os subprocessos são chamados. Mas a manipulação de arquivos de especificações oferece maior flexibilidade e permite que você faça coisas que as opções de linha de comando não podem, por exemplo. link

Você pode observar o que está sendo executado facilmente com:

gcc -v hello_world.c |& grep cc1

Exemplo de saída:

/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
    
por 15.05.2015 / 10:48
1

cc1 é o pré-processador e o compilador, cuja entrada é o código-fonte C e a saída é o código de montagem.

Você pode ver que cc1 é um dos comandos invocados (o primeiro, de fato) por emissão (dependendo da sintaxe da versão):% gcc-8 -v SOMESOURCE.c

    
por 15.11.2018 / 22:07

Tags