c++ - 链接器无法读取符号 : Malformed archive

标签 c++ linux gcc linker

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

../../lib/libutil.a:无法读取符号:格式错误的存档

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

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

$ uname -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 的最大限制可以处理我的选项是什么,而不会对构建系统的内部(顺便说一句,自动工具)进行太多调整?

最佳答案

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

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

  1. A set of 32-bit big endian integers. One for each symbol, recording the position within the archive of the header for the file containing this symbol.

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

没有简单的方法解决这个问题。您唯一现实的选择是切碎您的源代码,以便将其链接到多个 .a 文件中,每个文件的大小都在 4 GB 以下。

我确实看到了解决这个问题的困难方法。有问题的限制是符号表的一部分,我相信它是由 ranlib 创建的。如果你破解了你的 Makefile 以便不生成符号表(可能通过设置 RANLIB=/bin/true),则不会生成任何符号文件,所以你赢了达到这个极限。你的链接时间会受到很大的影响,认为,这将只允许你创建最多 9,999,999,999 字节的文件(不超过你已经创建的),因为 ar 中文件大小的 10 个字符限制 header 本身。

只需创建多个 .a 文件即可。

关于c++ - 链接器无法读取符号 : Malformed archive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45654547/

相关文章:

c++ - 在什么情况下无锁数据结构比基于锁的数据结构更快?

linux - Letsencrypt错误DNS问题: NXDOMAIN looking up A for etc

c++ - 我在哪里可以找到 GCC 源代码中 strncpy() 函数的实现?

c# - 为什么gcc支持Java而不支持C#

c++ - 在 C++ 中计算矩阵秩的最快方法/库是什么

c++ - c++中的成员模板函数有什么用?

c - 中断多线程系统调用

linux - linux shell 中连字符 ("-") 的用法是什么?

c++ - 通过复制传递 std::string 会被优化吗?

c++ - Visual Studio fatal error C1084 : Cannot read include file: 'c:\program files (x86)\microsoft visual studio 10.0\vc\include\map' : Permission denied