【问题标题】:linker could not read symbols: Malformed archive链接器无法读取符号:格式错误的存档
【发布时间】:2017-08-12 20:15:03
【问题描述】:

我正在尝试构建启用了调试符号 (-g) 的 C++ 软件。问题是额外的调试符号使包含的库太大以至于最终链接步骤失败

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

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

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

$ unname -a Linux 主机 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 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 的最大限制,我有哪些选择,而不会过多地使用构建系统的内部(顺便说一下,自动工具)?

【问题讨论】:

    标签: c++ linux gcc linker


    【解决方案1】:

    看起来存档的最大大小确实是 4 GB。

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

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

    我的解析方式是,.a 文件中的所有单个文件都必须在 4 GB 截止之前开始。不过,在这种情况下获得更有意义的错误消息会很高兴。

    解决这个问题没有简单的方法。您唯一现实的选择是拆分您的源代码,以便将其链接到多个 .a 档案中,每个档案的大小都不到 4 gig。

    我确实看到了解决这个问题的艰难方法。有问题的限制是符号表的一部分,我相信它是由ranlib 创建的。如果你破解你的Makefile 以便不会生成符号表(可能通过设置RANLIB=/bin/true),则不会生成符号文件,所以你不会达到这个限制。认为您的链接时间会受到很大影响,并且由于 ar 标头中文件大小的 10 个字符限制,这只允许您创建最多 9,999,999,999 字节的存档(不会比您已经创建的多多少)自己。

    只需创建多个.a 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 2013-01-16
      • 2018-01-09
      • 2012-01-27
      • 1970-01-01
      相关资源
      最近更新 更多