2016-08-23 25 views
3

升級到GHC一個近期 Ubuntu的機器上8.0後,我得到了下面的生成錯誤:ghc 8.0 cabal build error「ld:-r和-pie可能不能一起使用」已知?

/usr/bin/ld: -r and -pie may not be used together

對同一問題的不同的錯誤信息是:

relocation R_X86_64_32 against `.rodata' can not be used when making a > shared object; recompile with -fPIC

這是一個已知的錯誤?還有其他解決方案嗎?

+0

這個問題是節省3個小時的工作,爲尋找解決的辦法(我浪費了3小時...) – mrsteve

+2

既然你知道一個解決方案,你可以將它張貼作爲更好的可見性的答案嗎?謝謝! (回答你自己的問題是完全合理的,雖然在你發佈問題後的第一個15分鐘內可能會有超時停止。) –

+1

你提出的建議,回答了我自己的問題。 – mrsteve

回答

2

的解決方案是使用鏈接標誌「 - 沒有餡餅」:

cabal -v --ghc-option="-optl-no-pie" install cabal-install 

是懷疑這也許是是在以某種方式相互衝突的Ubuntu設置一個隱含的LD標誌。

0

好的,這是一個令人難以置信的!哈克解決方案,但它確實讓我超越了無法構建grub的直接問題。它應該適用於任何其他應用程序,但它是如此!哈克,我不會離開這個地方很長時間。

我意識到海報的問題是關於cabal而不是grub。但問題會影響多個程序,使用-fno-pie編譯器標誌的「正確」解決方案實際上不起作用。顯然最新版本的gcc默認設置爲「pie」,這優先於-fno-pie標誌。或者至少有時候。

這是我的工作對黑客gcc版本6.2.0-5ubuntu12,lubuntu 16.10(yakkety),linux內核4.8.0-22 ......建立GRUB 2.02〜beta3版:

# TO HACK 
sudo cp /usr/bin/gcc /usr/bin/gcc.orig 
sudo cp /usr/bin/gcc /usr/bin/gcc.patch 
sudo rm /usr/bin/gcc 
sudo ln -s /usr/bin/gcc.patch /usr/bin/gcc 
sudo bless /usr/bin/gcc.patch 
# search and replace "-pie -z now" with "-v -z now" (see below) 
# save changes and exit 'bless' 

也就是說,使用'bless'十六進制編輯器搜索文本字符串-pie -z now並將該字符串更改爲-v -z now確保將「pie」替換爲「v space space」增加相同數量的字符。

這樣做是破解編譯器發送-v到鏈接器而不是-pie。如果你想親自看看編譯器在做什麼,只需在編譯器的CFLAGS列表中包含-Q -v並仔細閱讀。即使你指定了-fno-pie,dang的東西仍然會拋出一個-pie選項給鏈接器。無論如何,當你完成後一定要把所有東西都放回去。

# UNDO THE HACK 
sudo ln -f -s /usr/bin/gcc.orig /usr/bin/gcc 

# REDO THE HACK 
sudo ln -f -s /usr/bin/gcc.patch /usr/bin/gcc 
相關問題