4

我最近发现我编写的在 Windows 上编译 HDBC-postgresql 的指令不再适用于 Haskell 平台 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.adlltool --no-idata4 --no-idata5但随后错误消息更改为Unknown PEi386 section name `.idata$7'.

这似乎是GHC 错误 7103

根据PE 和 COFF 规范,美元符号包含在部分名称中时具有特殊含义,表示“分组部分”。链接器应该丢弃 "$" 和它后面的所有字符以创建一个合并的.idata部分,其中 "$" 后面的字符用于确定对合并部分的贡献的顺序。

有没有办法强制dlltool不输出分组部分?

或者,有没有办法获取 GNU 存档(A 文件),合并所有分组的部分,并输出生成的合并导入库(imlib)?

编辑: 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 回答