链接器无法读取符号:格式错误的存档

时间:2017-08-12 20:15:04

标签: c++ linux gcc linker

我正在尝试构建一个启用了调试符号的C ++软件(-g)。问题是附加的调试符号使得包含的库很大,最终链接步骤失败

../../lib/libutil.a: could not read symbols: Malformed archive

(至少我认为它的失败是因为它的大小,在磁盘上略大于6 GB)

我环顾四周,发现可能有4 GB静态库的最大大小的提示。不确定这是否适用于我的64位CentOS系统:

$ uname -a Linux主机2.6.32-431.el6.x86_64#1 SMP Fri 11月22日03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux

我使用的是g ++(GCC)4.8.2编译器,binutils版本是GNU ld版本2.20.51.0.2-5.36.el6。

如果确实最大限制为4GB,那么归档工具或链接器可以处理我的选项而不会对构建系统的内部进行太多调整(顺便说一句是autotools)?

1 个答案:

答案 0 :(得分:1)

看起来档案的最大尺寸确实是4千兆字节。

维基百科有一个nice write-up of archive file format。您似乎达到的限制是:

  
      
  1. 一组32位大端整数。每个符号一个,   记录标题存档中的位置   包含此符号的文件。
  2.   

我解析这个问题的方法是,.a文件中的所有单个文件必须在4千兆字节截止之前启动。不过,在这种情况下获得更有意义的错误信息会很高兴。

不容易解决这个问题。您唯一可行的选择是切断源代码,以便将其链接到多个.a档案中,每个档案的大小不超过4个。

我确实看到了很难解决这个问题。有问题的限制是符号表的一部分,我相信它是由ranlib创建的。如果您破解了Makefile以便无法生成符号表(可能通过设置RANLIB=/bin/true),则不会生成符号文件,因此您不会达到此限制。考虑到你的链接时间会受到很大影响,这只会让你创建最多9,999,999,999字节的存档(不超过你已创建的存档数),因为{{1}中的文件大小限制为10个字符标题本身。

只需创建多个ar文件。