その場所はgccコードにハードコードされていますか、またはgccはas
を呼び出していますか?PATH変数にはas
の場所が必要ですか?gccはas、ldなどのbinutils実行ファイルをどのように見つけるのですか?
後者の場合、2つの完全に分離したgccツールチェーンをどのように作成できますか?つまり、gcc-A
は、as-A
とgcc-B
の呼び出しは、as-A
とas-B
の両方がas
と呼ばれる場合、どのようにしてas-B
を呼び出すことができますか?
その場所はgccコードにハードコードされていますか、またはgccはas
を呼び出していますか?PATH変数にはas
の場所が必要ですか?gccはas、ldなどのbinutils実行ファイルをどのように見つけるのですか?
後者の場合、2つの完全に分離したgccツールチェーンをどのように作成できますか?つまり、gcc-A
は、as-A
とgcc-B
の呼び出しは、as-A
とas-B
の両方がas
と呼ばれる場合、どのようにしてas-B
を呼び出すことができますか?
一部のパス(たとえば、cc1
)がコンパイルされます。その他(たとえば、as
)は、$ PATHで通常のルックアップを使用します。これは、GCCが設定されているオプションによって異なる場合があります。
strace
を実行し、exec|stat
をグレープすると、かなり簡単にわかります。あなたはそれを探しているの 不足から見ることができるように、コンパイル時にパスすることによりCC1への呼び出しである
$ 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", …
。 $ 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
これは$ PATH内でas
を探しています。あなたはそれぞれ$$$$の$$$の位置にあるそれぞれの を試してみることができます。
私はstatとexecだけでもたくさんのstrace出力を省いています.複数のページがあります。
gcc -v
を実行すると、(configure行の一部として)コンパイルされたパスの一部が表示されます。
はそのため、アドホックのオプションがあります:gccのドキュメントを引用-B *接頭辞*、:
各サブプログラムが実行されるようにするには、いずれかの場合、コンパイラドライバは最初、-Bプレフィックスをしようとします。 その名前が見つからない場合、または-Bが指定されていない場合、ドライバは2つの標準接頭辞 を試します。これらは/ usr/lib/gcc /および/ usr/local/lib/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
ありがとうございます。どの設定オプションが最終的な動作を定義しているか知っていますか?/my/path/asとmy/path/ldのみを使用するようにgccを制限する方法はありますか? –
@MichalisVichos:おそらく設定フラグ '--with-as =/my/path/as'がそうするでしょう。設定文書が表示されたら、http://gcc.gnu.org/install/configure.htmlから入手できます(もちろん './configure --help'でも可能です)。 – derobert