作爲一個小例子,我試圖用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,現在我比以前更加困惑了。
Rein我很欣賞這個問題的正確範圍。我寧願你添加GCC,而不是編輯GHC和LD,因爲它確實發生在鏈接過程中,並且是GHC特有的問題,因爲它看似沒有在Win32上處理.eh_frame。在C/C++中針對這個庫創建的庫和可執行文件運行得很好。 – M15K
我不會編輯標籤,但我不明白這與ghc或haskell有什麼關係。 Curl的源代碼中沒有單一的haskell文件,所以我無法理解GHC是如何導致它失敗的。這個問題也沒有提到ghc一次。如果你的問題確實與haskell和/或ghc有關,你需要提供更多信息。 –
夠公平的,我可以肯定地看到混亂。提到curl-1.3.8是Haskell綁定到庫的。捲曲的當前版本是7.33或更早版本。我的錯誤是不清楚。 – M15K