2011-10-09 8 views
11

その場所はgccコードにハードコードされていますか、またはgccはasを呼び出していますか?PATH変数にはasの場所が必要ですか?gccはas、ldなどのbinutils実行ファイルをどのように見つけるのですか?

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

答えて

10

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

+0

ありがとうございます。どの設定オプションが最終的な動作を定義しているか知っていますか?/my/path/asとmy/path/ldのみを使用するようにgccを制限する方法はありますか? –

+1

@MichalisVichos:おそらく設定フラグ '--with-as =/my/path/as'がそうするでしょう。設定文書が表示されたら、http://gcc.gnu.org/install/configure.htmlから入手できます(もちろん './configure --help'でも可能です)。 – derobert

1

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

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

1

またと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 
関連する問題