2016-03-03 174 views
0

我已經從源代碼構建gcc 4.9.3,並使用一些前綴將其安裝到我的主目錄中,例如, gcc4.9如何執行已安裝的gcc-ar以使用特定的binutils版本?

現在我想使用binutils的新版本以及gcc 4.9.3。我已經構建了它們並分別安裝在我的主目錄中,前綴爲binutils2.26

我如何強制gcc-argcc4.9使用從binutils2.26ar而不是系統?它總是呼叫/usr/bin/ar,看起來沒有選項可以指定。以某種方式更換/usr/bin/ar不是一個選項 - 我沒有root權限在這臺機器上。

+0

你應該認識到,在你的構建系統實際上(不要讓它調用默認的gcc-ar)。 –

+0

如何?我調用'/ home/foo/gcc4.9/gcc-ar',但仍然調用'/ usr/bin/ar'。 – Rost

+0

_「如何?我打電話給'/home/foo/gcc4.9/gcc-ar'"_而不是調用'/ home/foo/binutils2.26/ar'。 –

回答

1

我設法解決這個問題。

使用strace我發現gcc-ar幾個目錄,包括<gcc install dir>/libexec/gcc/x86_64-redhat-linux/4.9.3查找ar

那麼顯而易見的解決方案是建立在這個目錄中對應的目標可執行binutils2.26鏈接:

cd "<gcc install dir>/libexec/gcc/x86_64-redhat-linux/4.9.3" 
    for file in ~/binutils2.26/bin/* ; do ln -s "${file}" ; done 

後,在~/binutils2.26/bin所有可執行文件將被複制在GCC 4.9.3目錄和鏈接時將自動使用按照gcc版本構建。

2

使用GCC的-B標誌,並在包含ar要執行該目錄指向它。有關此標誌的更多詳細信息,請參見gcc manual

gcc-ar -B/path/to/your/dir ... 

似乎爲我工作:

$ strace -f -eexecve gcc-ar rc foo.a /dev/null |& grep /ar 
[pid 14485] execve("/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/../../../../x86_64-pc-linux-gnu/bin/ar", [...]) = 0 
$ strace -f -eexecve gcc-ar rc foo.a /dev/null -B/usr/bin |& grep /ar 
[pid 14493] execve("/usr/bin/ar", [...]) = 0 
$ strace -f -eexecve gcc-ar rc foo.a /dev/null -B/usr/x86_64-pc-linux-gnu/binutils-bin/2.26/ |& grep /ar 
[pid 14500] execve("/usr/x86_64-pc-linux-gnu/binutils-bin/2.26/ar", [...]) = 0 
+0

不幸的是,這對我不起作用,'gcc-ar'只是把這個標誌傳遞給'/ usr/bin/ar' ... – Rost

+0

你救了我的一天! :) – ladislas