好的,這是一個令人難以置信的!哈克解決方案,但它確實讓我超越了無法構建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
這個問題是節省3個小時的工作,爲尋找解決的辦法(我浪費了3小時...) – mrsteve
既然你知道一個解決方案,你可以將它張貼作爲更好的可見性的答案嗎?謝謝! (回答你自己的問題是完全合理的,雖然在你發佈問題後的第一個15分鐘內可能會有超時停止。) –
你提出的建議,回答了我自己的問題。 – mrsteve