微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

x86 – 如何在Windows上解决GHC错误“Unknown PEi386 section name` .idata $4’”?

我最近发现在 Windows上编译HDBC-postgresqlinstructions 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

我尝试用dlltool –no-idata4 –no-idata5重新制作libpq.a,但随后错误信息改为UnkNown PEi386部分名称`.idata $7′.

这似乎是GHC bug 7103.

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

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

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

编辑:Haskell Platform 2012.4.0.0发生了同样的错误.

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

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

解决方法

The linker is supposed to discard the “$” and all characters that follow it to create a merged .idata section

是的,但这只是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)
  }

相当不可思议,但鞋子适合.确保链接器使用此类脚本.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐