2013-11-26 68 views
2

作爲一個小例子,我試圖用gcc-4.8.1編譯Haskell庫綁定curl-1.3.8。我試圖綁定在Win32平臺上的cURL庫版本7.33-x86。GHC/GCC編譯第三方庫並處理.eh_frame

我很好奇其他人如何處理由於.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會更容易/「更好」嗎,還是回收站中的新代碼有效繞過這個錯誤?

編輯:補充

我只是檢查了我的Linux虛擬機之一,圖書館確實有在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

Rein我很欣賞這個問題的正確範圍。我寧願你添加GCC,而不是編輯GHC和LD,因爲它確實發生在鏈接過程中,並且是GHC特有的問題,因爲它看似沒有在Win32上處理.eh_frame。在C/C++中針對這個庫創建的庫和可執行文件運行得很好。 – M15K

+1

我不會編輯標籤,但我不明白這與ghc或haskell有什麼關係。 Curl的源代碼中沒有單一的haskell文件,所以我無法理解GHC是如何導致它失敗的。這個問題也沒有提到ghc一次。如果你的問題確實與haskell和/或ghc有關,你需要提供更多信息。 –

+0

夠公平的,我可以肯定地看到混亂。提到curl-1.3.8是Haskell綁定到庫的。捲曲的當前版本是7.33或更早版本。我的錯誤是不清楚。 – M15K

回答

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平臺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 

MAYBE值得注意:每隔依賴被編譯成一個共享庫

不完全確定的問題,但我會冒險猜測我可能應該將Network.Curl庫編譯爲動態庫。還有一些'骨頭上的肉',使這一點更容易,但問題已得到解答,我可以生成一個工作的可執行文件。

相關問題