我最近發現在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.a
與dlltool --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
部分。
嘗試直接鏈接到dll而不是鏈接到導入庫 – Simon