gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:31 28 4
gpt4 key购买 nike

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

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

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

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

$ uname -aLinux 主机 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com