2012-11-03 74 views
4

我最近發現在Windows上編譯HDBC-postgresql的instructions I had written不再使用Haskell Platform 2012.2.0.0。該庫建立好的,但試圖內置庫鏈接時,cabal失敗:

 
Loading package HDBC-postgresql-2.3.2.1 ... ghc.exe: Unknown PEi386 section name 
`.idata$4' (while processing: C:/PROGRA~1/POSTGR~1/9.2/lib\libpq.a) 
ghc.exe: panic! (the 'impossible' happened) 
    (GHC version 7.4.1 for i386-unknown-mingw32): 
     loadArchive "C:/PROGRA~1/POSTGR~1/9.2/lib\\libpq.a": failed 

我試圖重新制定libpq.adlltool --no-idata4 --no-idata5,但隨後的錯誤信息更改爲Unknown PEi386 section name `.idata$7'

這似乎是GHC bug 7103

根據PE and COFF Specification,美元符號包含在部分名稱中時具有特殊含義,表示「分組部分」。鏈接器應放棄「$」及其後的所有字符以創建合併的.idata部分,其中「$」後面的字符用於確定對合並部分的貢獻排序。

有沒有辦法強制dlltool不輸出分組部分?

另外,有沒有辦法獲取GNU歸檔(A文件),合併所有分組的部分,並輸出結果合併的導入庫(implib)?

編輯: Haskell平臺2012.4.0.0發生同樣的錯誤。

EDIT2在看了the source code of dlltool後,似乎沒有辦法強制它不輸出分組部分。另外,我還沒有找到一個可以將分組的部分合併到目標文件中的現成的實用程序。

出於賞金和這個問題的目的,我正在改變它:如何構造一個給定模塊定義(DEF)文件的單個.idata部分。

+0

嘗試直接鏈接到dll而不是鏈接到導入庫 – Simon

回答

1

鏈接器應該放棄「$」和它後面的創建合併.idata段

是所有字符,但是這僅僅是Microsoft鏈接的默認行爲。我沒有足夠的速度在你的工具鏈上,所以只是一些提示。 gcc鏈接器需要顯式配置才能將各種.idata $ x部分合併到一個.idata節中。這是由SECTION指令完成的。在似乎由腳本完成的明暗中,示例1可用here。注意腳本的這一部分:

.idata BLOCK(__section_alignment__) : 
    { 
    /* This cannot currently be handled with grouped sections. 
     See pe.em:sort_sections. */ 
    SORT(*)(.idata$2) 
    SORT(*)(.idata$3) 
    /* These zeroes mark the end of the import list. */ 
    LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); 
    SORT(*)(.idata$4) 
    __IAT_start__ = .; 
    SORT(*)(.idata$5) 
    __IAT_end__ = .; 
    SORT(*)(.idata$6) 
    SORT(*)(.idata$7) 
    } 

漂亮難以辨認,但鞋適合。確保你的鏈接器使用這樣的腳本。

+0

我的猜測是,你說的對,這與它有關。我在Haskell Platform文件夾中查找了一個鏈接器腳本,但找不到一個。非常感謝您提供這些信息。在使用MinGW鏈接二進制文件時,我並沒有意識到鏈接腳本涉及幕後。 –

相關問題