GHC / GCC编译第三方库并处理.eh_frame

时间:2013-11-26 16:36:23

标签: haskell gcc ghc

作为一个小例子,我试图用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,我现在比以前更困惑了。

1 个答案:

答案 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库编译为动态。仍然有一些“骨头上的肉”使这更容易,但问题已得到解答,我可以生成一个可执行的可执行文件。