作为一个小例子,我试图用gcc-4.8.1编译Haskell库绑定curl-1.3.8。我试图绑定Win32平台上的cURL库版本7.33-x86。
我很好奇其他人如何处理由于.eh_frame部分导致的[GHC]链接错误。我看到/rts/Linker.c中看起来像是一个相对较新的提交,看起来需要一些步骤来解决或至少绕过这个问题,但我不确定这是否是修复。
我使用objconv并从Easy.o和curlc.o中删除了.eh_frame,然后将这些部分添加回到生成的[Haskell]库中。
curlc.obj: file format pe-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000260 00000000 00000000 000000dc 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 00000000 00000000 00000000 2**2
ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000000 2**2
ALLOC
3 .rdata 00000008 00000000 00000000 00000398 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .rdata$zzz 00000014 00000000 00000000 000003a0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
Easy.obj: file format pe-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000041ac 00000000 00000000 00000104 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000124 00000000 00000000 00005ffc 2**2
CONTENTS, ALLOC, LOAD, RELOC, DATA
2 .rodata 00000024 00000000 00000000 0000635c 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .rdata 00000080 00000000 00000000 00006380 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .rdata$zzz 00000020 00000000 00000000 00006400 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .bss 00000000 00000000 00000000 00000000 2**2
ALLOC
但是当然libcurl的目标文件的编译版本充满了.eh_frame部分。我应该在编译期间尝试将该部分排除为链接选项吗?是否更容易/“更好”恢复到gcc-4.5.x或者repo中的新代码是否有效地绕过了这个错误?
编辑:补充
我刚刚检查了我的一个Linux VM,并且该库在obj文件中确实有.eh_frame部分。
Easy.o: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000062f9 0000000000000000 0000000000000000 00000040 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .rodata 00000024 0000000000000000 0000000000000000 00006340 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .rodata.str1.1 0000007d 0000000000000000 0000000000000000 00006364 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .eh_frame 000000d0 0000000000000000 0000000000000000 000063e8 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
4 .data 00000260 0000000000000000 0000000000000000 000064b8 2**3
CONTENTS, ALLOC, LOAD, RELOC, DATA
5 .bss 00000000 0000000000000000 0000000000000000 00006718 2**2
ALLOC
6 .comment 00000036 0000000000000000 0000000000000000 00006718 2**0
CONTENTS, READONLY
7 .note.GNU-stack 00000000 0000000000000000 0000000000000000 0000674e 2**0
CONTENTS, READONLY
curlc.o: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000206 0000000000000000 0000000000000000 00000040 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 0000000000000000 0000000000000000 00000248 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 0000000000000000 0000000000000000 00000248 2**2
ALLOC
3 .rodata.str1.1 00000007 0000000000000000 0000000000000000 00000248 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .comment 0000002b 0000000000000000 0000000000000000 0000024f 2**0
CONTENTS, READONLY
5 .note.GNU-stack 00000000 0000000000000000 0000000000000000 0000027a 2**0
CONTENTS, READONLY
6 .eh_frame 000002b0 0000000000000000 0000000000000000 00000280 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
gcc版本是4.7.3,我现在比以前更困惑了。
答案 0 :(得分:0)
我能够使用Network.Curl Haskell库获得一个简单的示例程序。
-- curlTest.hs
import qualified Network.Curl as C
main = do
(code,str) <- C.curlGetString "http://www.google.com" []
putStrLn str
通过恢复Haskell Platform 2013.2.0.0附带的mingw编译器。版本恰好是4.5.2。 [我之前已将mingw32-gcc-4.8.2与GHC使用的版本联系起来,因为我认为使用一致版本可以解决比创建更多的问题。]
我仍在使用之前创建的.eh_frame剥离库。但是,在尝试加载ghc repl时,我收到以下符号错误:
... During interactive linking, GHCi couldn't find the following symbol: curlzm1zi3zi8_NetworkziCurl_curlGetString_closure ...
这是curlc.c中的符号(包含Network.Curl库的帮助文件)。手动加载目标文件......
cmd> ghci -L. -llibcurl -llibeay32 -llibidn-11 -llibrtmp -llibssh2 -lssleay32 -lzlib1 -package curl curlc.o curlTest.hs
在运行时导致
final link ... ghc.exe: curlc.o: unknown symbol `__imp__curl_easy_getinfo' linking extra libraries/objects failed
可能需要注意:所有其他依赖项都编译成共享库
不完全确定问题,但我猜测我可能应该将Network.Curl库编译为动态。仍然有一些“骨头上的肉”使这更容易,但问题已得到解答,我可以生成一个可执行的可执行文件。