17

それらの場所は gcc コードにハードコードされていますか、それとも gcc が呼び出すだけで、PATH 変数に場所がas必要ですか?as

後者の場合、2 つの完全に別個の gcc ツールチェーンを作成するにはどうすればよいでしょうか? つまり、 とが両方とも呼ばれる場合、どのようにgcc-A呼び出しas-Agcc-B呼び出しを行うことができますか?as-Bas-Aas-Bas

4

3 に答える 3

14

一部のパス ( 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すると、コンパイルされたパスの一部が表示されます (構成行の一部として)。

于 2011-10-09T04:50:47.790 に答える
4

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 のパスと呼び出されるプログラムとは?

于 2015-05-16T18:20:37.617 に答える
3

そのためのアドホック オプションがあります: -B*prefix*、gcc ドキュメントを引用:

サブプログラムを実行するたびに、コンパイラ ドライバは最初に -B 接頭辞があればそれを試みます。その名前が見つからない場合、または -B が指定されていない場合、ドライバーは /usr/lib/gcc/ と /usr/local/lib/gcc/ の 2 つの標準プレフィックスを試行します。[...]

于 2013-02-22T21:22:19.830 に答える