我尝试编译静态Haskell的可执行文件时遇到了以下错误:
/usr/bin/ld.gold: error: /usr/lib/gcc/x86_64-linux-gnu/6/crtbeginT.o: requires dynamic R_X86_64_32 reloc against '__TMC_END__' which may overflow at runtime; recompile with -fPIC
collect2: error: ld returned 1 exit status
`gcc' failed in phase `Linker'. (Exit code: 1)
我相信我遇到这个问题,因为创建一个静态的构建。动态构建成功之前。
我怎么能解决这个问题?我不认为我手动编译任何东西。下面是我使用的泊坞窗图像Dockerfile
:https://github.com/freebroccolo/docker-haskell/blob/03467e1a14543d83d33833e669249a3c42f7b7c8/8.6/Dockerfile
我运行Debian拉伸(9)。
似乎可能是根据一个错误:https://bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/640734
我试着加入--ghc-options='-fPIC
到stack build
但也失败了:
/usr/bin/ld.gold: error: /usr/lib/gcc/x86_64-linux-gnu/6/crtbeginT.o: requires dynamic R_X86_64_32 reloc against '__TMC_END__' which may overflow at runtime; recompile with -fPIC
collect2: error: ld returned 1 exit status
`gcc' failed in phase `Linker'. (Exit code: 1)
The command '/bin/sh -c stack build --ghc-options='-fPIC -optl-static -optl-pthread' --force-dirty --copy-bins' returned a non-zero code: 1
我的回答可能并不完全,但是,直到出现一个更完整的答案,我们可以用下面的开始。
1. GCC手册。 Debian和自由软件基金会不幸的是对什么是自由软件稍有冲突的理解。 GCC手册可以帮助你的那一刻,但手册已经分离出了轻微的,技术性的法律理由Debian的非自由存档。
它违背了Debian的精神,建议任何人从非自由安装,不是吗?我只会说,我已经安装了GCC手册从非自由对我自己的Debian框如下所示。在/etc/apt/sources.list中:
deb http://mirror.us.leaseweb.net/debian/ stretch main contrib non-free
deb-src http://mirror.us.leaseweb.net/debian/ stretch main contrib non-free
(你可以列出哪个镜像你喜欢,但LEASEWEB的是不比任何人差。)然后,apt-get update
和apt-get install gcc-doc
,其次是info gcc
。)
2.选项GCC。在GCC手册,你可以打开章“调用GCC,”打开一节“代码生成选项”,然后按/
搜索-fPIC
。解释有简洁和技术,但它开始在正确的地方你的调查。 (即使解释没有意义的,你现在,你会稍后返回。)
3. Uekawa的Debian的库包装指南。然而,最有启发性的文件是有些秘密。这是一个标准的Debian文档,已知Debian开发人员,这对于模糊的原因并不在Debian的包装,所以非开发人员通常不知道这件事情。 Here它。
该链接的文档会告诉你这些库是如何工作的,怎么一编译和链接它们,等等。但是,如果您需要了解更多....
4. ELF规范。
这些细节到GCC构建和ld.gold
链接的格式。
5.自动工具。在某些时候,你的调查可能会导致你对GNU Autotools - 即的Autoconf,Automake的,Libtool程序,M4,等等。我不相信自动工具将解决您的问题,并且,即使他们这样做,我怀疑他们会做的方式,点亮你的认识过程。自动工具是有用的,但是,你的具体情况,我会避免追求Autotools的暂时。专注于其他来源,而。
诚然,有人在那里可能知道一个更直接的回答你的问题,但截至发稿时,那人还没有公布。同时,如果你需要研究它自己,我的回答给了来源。阅读这些是我会做什么。虽然不是一个Haskell程序员,读那些是我已经解决了过去的类似链接的问题。这些都是标准的来源。
阅读是最的教育,是在任何情况下广泛有用的,所以它不会浪费你的时间。
(我建议你避免接受我的答案,即使你选择给予好评的。你的问题是一个很好的问题。我们希望,直到它已得出比我更直接的回答这个问题保持开放。)
Arghiaueohtnuea ...
我在小集团文件有ghc-options: -O2 -dynamic
...删除此似乎已经解决了一切