最近、Windows で HDBC-postgresql をコンパイルするために書いた手順が、Haskell Platform 2012.2.0.0 では機能しないことがわかりました。ライブラリは正常にビルドされますが、ビルドされたライブラリをリンクしようとすると、次のcabal
エラーで失敗します。
パッケージ HDBC-postgresql-2.3.2.1 を読み込んでいます ... ghc.exe: 未知の PEi386 セクション名 `.idata$4' (処理中: C:/PROGRA~1/POSTGR~1/9.2/lib\libpq.a) ghc.exe: パニック! (「不可能」が起こった) (i386-unknown-mingw32 用の GHC バージョン 7.4.1): loadArchive "C:/PROGRA~1/POSTGR~1/9.2/lib\\libpq.a": 失敗しました
で作り直しlibpq.a
ましdlltool --no-idata4 --no-idata5
たが、エラーメッセージが に変わりましたUnknown PEi386 section name `.idata$7'
。
これはGHC バグ 7103のようです。
PE および COFF 仕様によると、ドル記号はセクション名に含まれる場合に特別な意味を持ち、「グループ化されたセクション」を示します。リンカは、「$」とそれに続くすべての文字を破棄して、マージされた.idata
セクションを作成することになっています。「$」に続く文字は、マージされたセクションへの貢献の順序を決定するために使用されます。
dlltool
グループ化されたセクションを強制的に出力しないようにする方法はありますか?
あるいは、GNU アーカイブ (A ファイル) を取得し、グループ化されたすべてのセクションをマージして、マージされたインポート ライブラリ (implib) を出力する方法はありますか?
編集: Haskell Platform 2012.4.0.0 でも同じエラーが発生します。
EDIT2のソースコードをdlltool
見た後、グループ化されたセクションを出力しないようにする方法はないようです。また、オブジェクト ファイル内のグループ化されたセクションをマージする既製のユーティリティも見つかりませんでした。
報奨金とこの質問のために、次のように変更します:.idata
モジュール定義 (DEF) ファイルを指定して単一のセクションを作成する方法。