如何解决 GHC 错误"Unknown PEi386 section name `.idata$4' "在 Windows 上?



我最近发现,我编写的指令在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)
  }

非常难以理解,但鞋子很合适。确保您的链接器使用这样的脚本。

相关内容

  • 没有找到相关文章

最新更新