ghc 8.0 cabal构建错误“ld:-r和-pie可能不能一起使用”已知?

时间:2016-08-23 23:29:16

标签: haskell ghc cabal

RECENT ubuntu计算机上升级到ghc 8.0后,出现以下构建错误:

  

/ usr / bin / ld:-r和-pie可能不能一起使用

针对同一问题的不同错误消息是:

  在制作&gt;时,不能使用<。>对`.rodata'重新定位R_X86_64_32共享对象;用-fPIC重新编译

这是一个已知的错误吗?还有其他解决方案吗?

2 个答案:

答案 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