X86 如何解决GHC错误“;未知PEi386节名“.idata$4'&引用;在窗户上?
我最近发现,在Windows上编译HDBC postgresql不再适用于Haskell Platform 2012.2.0.0。库可以正常生成,但尝试链接生成的库时,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
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,而不是链接到导入库