我最近发现在
Windows上编译HDBC-postgresql的
instructions 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) }
相当不可思议,但鞋子适合.确保链接器使用此类脚本.