目标文件有太多的部分(Object file has too many sections)

2019-09-03 20:46发布

我们正在大量使用的boost ::序列化和模板一般。 一切似乎很顺利。

除此之外,我们已经打在我们的Windows碰钉子建立。 这似乎导致目标文件过大的问题。 我们使用的MinGW / MSYS使用g ++ 4.7.0。

c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/as.exe: CMakeFiles/source.dir/sourcecode.cpp.obj: too many sections (33396)
C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Assembler messages:
C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Fatal error: can't write CMakeFiles/source.dir/sourcecode.cpp.obj: File too big

大师谷歌透露了这一消息存档, http://sourceforge.net/mailarchive/forum.php?thread_name=CA%2Bsc5mkLvj%3DW9w2%3DsY%3Dc_N%3DEwnsQuPDEX%3DiBcbsbxS3CuE_5Bg%40mail.gmail.com&forum_name=mingw-users

在这里面,它表明其他人打几乎相同的障碍。 它确实点到了Visual Studio中的一个选项/bigobj选项这似乎做什么,我们都需要。 然而,我们无法移动到Visual Studio。

一个建议是--hash尺寸添加到汇编器选项。 这并没有帮助。

如果我没有记错的话,问题就在于,对象文件,有在他们2 ^ 16项的限制。 实际上,根据错误信息,我敢说,这是一个签署2 ^ 16项,但这是花生。 该/bigobj为Visual Studio选项会更改为2 ^ 32。 邮件列表的结果不知道gcc的等效选项。 而且谷歌的结果似乎并没有相关这一点。

在这一点上,我们将不得不重构我们的代码(啊)来绕过这个限制。 但我仍然关注的是,沉重的模板,我们可以一次又一次地遇到问题(我们已经有三个源文件运行到它)。

所以我的问题是这样; 有没有GCC相当于微软/bigobj选项? 有没有办法,我还没有找到第三种选择?

Answer 1:

解决的办法是添加选项-Wa,-mbig-obj ,如果你的GCC的版本支持该选项。 你可能只在编译步骤,而不是一步连接需要。

如果你的编译器不支持该选项,你应该考虑使用的MinGW-W64和MSYS2 。



Answer 2:

错误"%B: too many sections (%d)"来自函数coff_compute_section_file_positions()位于bfd/coffcode.h 。 当输出它产生.obj文件(COFF格式),包含超过32766部。 有没有办法避免这种错误,至少没有,如果你想使用Windows的PE / COFF目标格式; COFF文件仅使用两个字节的文件头“NumberOfSections”。

这是我不清楚为什么as (GNU汇编)在32768的减去2帽部分的数量,而不是65536减去-1(部分0被保留); 但无论哪种方式,这可能不是,如果你正在做大量使用的模板你的编译器可以实现通过COMDAT节模板是不够的。

正如你已经注意到了,传球/bigobj微软的编译器使其输出高达2个31段,其中一个被改写的COFF格式“应该是足够的人。” 然而,被改写的格式正式无证的,我没有看到任何关于这个问题的非正式文件(博客文章或者什么具备的,你),所以直到有人用MSVC的副本可以写下使规范/bigobj ,它不站进入GNU工具的多少机会。

恕我直言,如果你想使Windows版本,您应该只是硬着头皮使用MSVC。 除了微软没人特别积极地浪费时间与PE / COFF格式摔跤。



Answer 3:

我发现在这个问题上的一些更新,它似乎是固定在64窗口的binutils新,见https://sourceware.org/ml/binutils/2014-03/msg00114.html和http://sourceforge.net/p / mingw的-W64 /错误/ 341 / 。 但是,我没有测试它作为这个修复并不适用于我,需要32个版本。



Answer 4:

我面临同样的问题,当我编译波科库使用MinGW-W64,事实证明,调试对象是巨大的一个实现文件。

正如你之前提到的 ,你可以拆分cpp文件,它会工作,但是当你和某人的源代码面对你不能这样做,不打破东西。

正如你可以打开编译器的优化解决方案:先从-O1高达-O3,每一步都将建立较小的目标文件,它可能会解决问题,但它确实在我的情况。 是的,对于调试版本可能不希望, 你可以尝试-oG以及



文章来源: Object file has too many sections