ghc 8.0 cabal 构建错误 "ld: -r and -pie may not be used together" 知道吗?

ghc 8.0 cabal build error "ld: -r and -pie may not be used together" known?

RECENT ubuntu 机器上升级到 ghc 8.0 后,我得到以下构建错误:

/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

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

解决方案是使用链接器标志“-no-pie”:

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

我怀疑它可能是在 ubuntu 上设置的一个隐式 LD 标志,它以某种方式存在冲突。

好吧,这太棒了! hacky 解决方案,但它确实让我解决了无法构建 grub 的直接问题。它应该适用于任何其他应用程序,但事实就是如此! hacky,我不会把它留在原地太久。

我知道发帖者的问题是关于 cabal,而不是 grub。但是这个问题影响了多个程序,使用 -fno-pie 编译器标志的 "correct" 解决方案实际上不起作用。显然,最新版本的 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 发送给链接器。如果您想亲眼看看编译器在做什么,只需将 -Q -v 包含在编译器的 CFLAGS 列表中,然后仔细阅读。即使您指定了 -fno-pie,该死的东西仍然会向链接器抛出一个 -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