我最近发现我编写的在 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.a
,dlltool --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) 文件的情况下构造单个部分。