X86 如何解决GHC错误“;未知PEi386节名“.idata$4'&引用;在窗户上?

X86 如何解决GHC错误“;未知PEi386节名“.idata$4'&引用;在窗户上?,x86,ghc,portable-executable,unix-ar,dlltool,X86,Ghc,Portable Executable,Unix Ar,Dlltool,我最近发现,在Windows上编译HDBC postgresql不再适用于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

我最近发现,在Windows上编译HDBC postgresql不再适用于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 正在加载程序包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节名`.idata$7'

这似乎是

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

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

或者,是否有方法获取GNU存档(一个文件),合并所有分组的部分,并输出结果合并的导入库(implib)

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

EDIT2查看之后,似乎没有办法强制它不输出分组的部分。此外,我还没有找到一个现成的实用工具,可以将分组的部分合并到一个对象文件中

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

链接器应该丢弃“$”及其后面的所有字符,以创建一个合并的.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)
  }

很难以捉摸,但鞋子很合脚。确保你的链接器使用这样一个脚本。

我猜,你是对的,这与此有关。我在Haskell Platform文件夹中查找链接器脚本,但找不到。非常感谢您提供这些信息。我没有意识到在使用MinGW链接二进制文件时,链接器脚本会在后台出现。请尝试直接链接到dll,而不是链接到导入库