2011-10-09 56 views
11

是他們的位置硬編碼到GCC的代碼或不GCC只是調用as,我們必須在我們的PATH變量as位置?gcc如何查找,ld和其他binutils可執行文件?

而在後一種情況下,我們如何可以創建兩個完全獨立的GCC工具鏈?我的意思是,如果as-Aas-B都被稱爲as,我們如何使gcc-A調用as-Agcc-B調用as-B

回答

10

其中一些路徑(例如到cc1)被編譯。其他(例如,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 

這是在$ PATH尋找as。你可以告訴它,因爲它按順序試圖在$ PATH中的每個 位置。

我省略了很多strace的輸出,即使只有統計和exec,其 幾頁長。

運行gcc -v會告訴你一些編譯時的路徑(configure行作爲部分)。

+0

非常感謝你。你知道哪些配置選項定義了最終的行爲嗎?有沒有辦法限制gcc只使用/ my/path/as和my/path/ld? –

+1

@MichalisVichos:可能配置標誌'--with-as =/my/path/as'會這樣做。出現configure文檔可以在http://gcc.gnu.org/install/configure.html找到(當然也可以用'./configure --help') – derobert

1

有對於一個特設的選項:-B *前綴*,引用文檔GCC:

對於要運行的每個子程序,編譯器驅動程序首先使用-B前綴,如果有的話。如果 該名稱沒有找到,或者如果沒有指定-B,驅動程序嘗試兩個標準前綴, 這是/ usr/lib中/海合會/和/ usr/local/lib目錄/ GCC /。 [...]

1

您還可以查詢與海灣合作委員會的搜索路徑:

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 
相關問題