cc1とgccの関係は何ですか?

cc1とgccの関係は何ですか?

Linuxサーバーのホームディレクトリ(ルートアクセスなし)にRubyをインストールしようとしていますが、もちろんgcccc1:

>: 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

実はCC1はWikipediaのGCCにリダイレクトされます。アイデンティティに近いことを示唆しているようですが、リダイレクトに関する注意事項以外には、GCCページにCC1に関する他の言及はありませんcc1でしgccた。

それらの関係は何ですか?このコンピュータでRubyをコンパイルできるという希望はありますか?

答え1

GCC には複数のステップのコンパイルがあり、各ステップを完了するためにさまざまな内部コマンドを使用します。特にCの場合は、まずcppで前処理し、次にアセンブリにコンパイルし、機械語にアセンブルしてから互いに接続します。

cc1は、前処理されたC言語ファイルをインポートしてアセンブリ言語に変換する内部コマンドです。 Cをコンパイルする実際の部分です。 C ++の場合、さまざまな言語のcc1plusやその他の組み込みコマンドがあります。

Wikibooksに書籍があります写真でコースを説明してください

残念ながら、cc1は内部コマンドであり、インストールの一部にすぎません。それがすべてならコンパイルできません。

答え2

gccccファミリのCコンパイラであるファミリの名前です。

itという単語は、ccUNIXシステムの特定のcコンパイラの一般名でもあります。たとえば、特定のビルドスクリプトまたは設定スクリプト内で環境変数を呼び出すのは一般的ですCC。 cを指し、必ずしも実行を意味するわけではありません。オブジェクトがコンパイルされるコンパイラです。これはしばしば「コンパイルのみ」するコンパイラを指すために使用されます。ただし、ccfromはgcc完成した実行可能ファイルを出力できるため、対応するリンカーを使用して最終ステップも実行できます。

この用語はcc1しばしば「内部的に」使用されるか、GNU文書(はい)は、gcc関連ライブラリが属する言語やコンパイラに基づいて名前を付けるためにも使用されます(この場合はcc1 = cコンパイラに属します)。

実際、gccその言葉が何を意味するのかを尋ねるならcc1

gcc -print-prog-name=cc1

ccコンパイラのライブラリパスで応答する必要があるため、実行したいのは実際の実行ファイルではなくライブラリです。

CCがより簡単であることを覚えておいてくださいCコンパイラそして、すべてを簡素化するために、このcc1を見回すと、長い旅を始めようとしない限り、内部的に仕事がどのように機能するかを知る必要はありません。

答え3

他の人が述べたようにgcccc1

これ精密cc1および他のサブルーチン(例えば、and)は次のようにcpp呼び出されます。ld仕様書滞在。

現在の仕様ファイルは以下から見ることができます。

gcc -dumpspecs

関連部分は次のとおりです。

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

独自の仕様ファイルを使用できます。

gcc -specs=<specs-file>

もちろん、GCCに渡されたコマンドラインオプションは、子プロセスの呼び出し方法を間接的に変更します。ただし、仕様ファイルはより柔軟性を提供し、次のようにコマンドラインオプションでは実行できない操作を実行できます。https://stackoverflow.com/questions/7493620/inhibit-default-library-paths-with-gcc

次のコマンドを使用すると、実行中の内容を簡単に観察できます。

gcc -v hello_world.c |& grep cc1

記載されているように:https://stackoverflow.com/questions/40572041/how-to-make-gcc-show-the-internal-commands-known

出力例:

/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

答え4

cc1これはプリプロセッサとコンパイラです。入力はCソースコード、出力はアセンブリコードです。

cc1実行によって呼び出されるコマンドの1つ(実際には最初のコマンド)を見ることができます(構文はバージョンによって異なります)。
gcc-8 -v SOMESOURCE.c

関連情報