それらの場所は gcc コードにハードコードされていますか、それとも gcc が呼び出すだけで、PATH 変数に場所がas
必要ですか?as
後者の場合、2 つの完全に別個の gcc ツールチェーンを作成するにはどうすればよいでしょうか? つまり、 とが両方とも呼ばれる場合、どのようにgcc-A
呼び出しas-A
とgcc-B
呼び出しを行うことができますか?as-B
as-A
as-B
as
一部のパス ( tocc1
など) はコンパイルされています。その他 ( などas
) は、$PATH で通常のルックアップを使用します。これは、GCC が構成されているオプションによって異なります。
strace
で実行し、grep を実行すると、かなり簡単にわかりexec|stat
ます。
$ strace -f gcc foo.c -o foo |& grep exec
⋮
[pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", …
これは、コンパイルされたパスによる cc1 の呼び出しです。探していないことからわかるように。$PATH にもありません。
[pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
[pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
[pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0
as
それは$PATHで探しています。$PATH の各場所を順番に試しているのでわかります。
strace の出力の多くを省略しました。stat と exec だけでも、数ページの長さです。
実行gcc -v
すると、コンパイルされたパスの一部が表示されます (構成行の一部として)。
2 つの完全に別個の gcc ツールチェーンを作成するにはどうすればよいでしょうか?
ソースから GCC を 2 回コンパイルします。詳細な手順は次のとおりです: Multiple glibc libraries on a single host
私が見る限り、すべてがハードコードされており、高度に結合されています。他にまともな解決策はないと思います。
GCC 検索パスを照会する
次の方法で GCC 検索パスを照会することもできます。
gcc -print-search-dirs | grep -E '^programs' | tr ':' '\n'
出力例:
programs
=/usr/lib/gcc/x86_64-linux-gnu/6/
/usr/lib/gcc/x86_64-linux-gnu/6/
/usr/lib/gcc/x86_64-linux-gnu/
/usr/lib/gcc/x86_64-linux-gnu/6/
/usr/lib/gcc/x86_64-linux-gnu/
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/
および特定のプログラム:
gcc -print-prog-name=cc1
出力例:
/usr/lib/gcc/x86_64-linux-gnu/6/cc1
GCC 仕様ファイル
cpp
最終的な, ld
,as
を実際に決定するのは、GCC ソース コードの「仕様」ファイルであることに言及することはお勧めです。以下も参照してください: GCC のパスと呼び出されるプログラムとは?
そのためのアドホック オプションがあります: -B*prefix*、gcc ドキュメントを引用:
サブプログラムを実行するたびに、コンパイラ ドライバは最初に -B 接頭辞があればそれを試みます。その名前が見つからない場合、または -B が指定されていない場合、ドライバーは /usr/lib/gcc/ と /usr/local/lib/gcc/ の 2 つの標準プレフィックスを試行します。[...]