4

最近、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) ファイルを指定して単一のセクションを作成する方法。

4

1 に答える 1

1

リンカーは、「$」とそれに続くすべての文字を破棄して、マージされた .idata セクションを作成することになっています

はい。ただし、これは Microsoft リンカーの既定の動作にすぎません。私はあなたのツールチェーンについて十分なスピードを持っていないので、ヒントをいくつか。gcc リンカでは、さまざまな .idata$x セクションを単一の .idata セクションにマージするための明示的な構成が必要です。これは SECTION ディレクティブによって行われます。スクリプトによって実行されるように見える mingw では、サンプルがここで入手できます。スクリプトの次の部分に注意してください。

  .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)
  }

かなり不可解ですが、靴はフィットします。リンカーがそのようなスクリプトを使用していることを確認してください。

于 2012-11-11T16:23:51.650 に答える