在 RECENT ubuntu计算机上升级到ghc 8.0后,出现以下构建错误:
/ usr / bin / ld:-r和-pie可能不能一起使用
针对同一问题的不同错误消息是:
在制作&gt;时,不能使用<。>对`.rodata'重新定位R_X86_64_32共享对象;用-fPIC重新编译
这是一个已知的错误吗?还有其他解决方案吗?
答案 0 :(得分:2)
解决方案是使用链接器标志“-no-pie”:
cabal -v --ghc-option="-optl-no-pie" install cabal-install
怀疑它可能是在ubuntu上设置的隐式LD标志,它在某种程度上是冲突的。
答案 1 :(得分:0)
好的,这真是令人难以置信! hacky解决方案,但它确实让我超越了无法构建grub的直接问题。它应该适用于任何其他应用程序,但它是如此!哈基,我不会长时间留下这个。
我意识到海报的问题是关于阴谋,而不是gr ..但是这个问题影响了多个程序,并且正确地解决了这个问题。使用-fno-pie编译器标志的解决方案实际上并不起作用。显然,最新版本的gcc套装&#34;馅饼&#34;默认情况下为on,这优先于-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'
也就是说,使用&#39; bless&#39;十六进制编辑器搜索文本字符串 -pie -z now 并将该字符串更改为 -v -z now ,确保替换&#34; pie&#34;用&#34; v空间&#34;所以它占用了相同数量的字符。
这样做是黑客编译器将-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