我最近发现,我编写的指令在Windows上编译HDBC-Postgresql不再使用Haskell Platform 2012.20.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:恐慌!(发生了"不可能") (GHC版本7.4.1 for I386 InjeNown-MingW32): 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错误7103。
根据PE和Coff规范,美元符号在截面名称中包含时具有特殊的含义,并发出"分组部分"的信号。链接器应该丢弃" $"和随后的所有字符以创建合并的.idata
部分,其中使用" $"之后的字符来确定对合并部分的贡献。
有没有办法强制dlltool
不输出分组的部分?
另外,是否可以使用GNU存档(文件),合并所有分组部分并输出结果合并的导入库(inplib)?
?编辑: Haskell Platform 2012.4.0.0。
发生相同的错误 edit2 查看dlltool
的源代码后,似乎没有一种方法可以强迫它不要输出分组的部分。另外,我还没有找到一个现成的实用程序,可以合并对象文件中的分组部分。
出于赏金和这个问题的目的,我将其更改为:如何构造一个.idata
节给定模块定义(DEF)文件。
链接器应该丢弃" $",以及随后的所有字符以创建合并的.idata部分
是的,但这只是Microsoft Linker的默认行为。我的工具链上的速度不足,所以只有一些提示。GCC链接器需要明确的配置,将各种.idata $ x部分合并为单个.idata部分。这是由"部分指令"完成的。在似乎由脚本完成的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)
}
非常难以理解,但鞋子很合适。确保您的链接器使用这样的脚本。