【问题标题】:How to resolve the GHC error "Unknown PEi386 section name `.idata$4' " on Windows?如何解决 Windows 上的 GHC 错误“Unknown PEi386 section name `.idata$4'”?
【发布时间】:2012-11-03 12:58:30
【问题描述】:

我最近发现 instructions I had written 在 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": 失败

我尝试使用dlltool --no-idata4 --no-idata5 重新制作libpq.a,但随后错误消息更改为Unknown PEi386 section name `.idata$7'

这似乎是GHC bug 7103

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

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

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

编辑: Haskell Platform 2012.4.0.0 也会出现同样的错误。

EDIT2查看the source code of dlltool 后,似乎没有办法强制它不输出分组部分。另外,我还没有找到一个现成的实用程序,可以合并目标文件中的分组部分。

出于赏金和这个问题的目的,我将其更改为:如何在给定模块定义 (DEF) 文件的情况下构造单个 .idata 部分。

【问题讨论】:

  • 尝试直接链接dll而不是链接导入库

标签: x86 ghc portable-executable unix-ar dlltool


【解决方案1】:

链接器应该丢弃“$”及其后面的所有字符以创建合并的 .idata 部分

是的,但这只是 Microsoft 链接器的默认行为。我对你的工具链的速度不够快,所以只是一些提示。 gcc 链接器需要显式配置才能将各种 .idata$x 部分合并到单个 .idata 部分中。这是由 SECTION 指令完成的。在似乎由脚本完成的 mingw 中,有一个示例可用 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)
  }

相当神秘,但鞋子合脚。确保您的链接器使用这样的脚本。

【讨论】:

  • 我的猜测是,你是对的,这与它有关。我在 Haskell Platform 文件夹中寻找链接描述文件,但找不到。非常感谢您提供这些信息。使用 MinGW 链接二进制文件时,我没有意识到在幕后涉及链接器脚本。
猜你喜欢
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多