This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/66AK2G12:链接器行为从8.1更改为8.2?

Guru**** 2035740 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/782418/compiler-66ak2g12-linker-behavior-changes-from-8-1-to-8-2

器件型号:66AK2G12

工具/软件:TI C/C++编译器

我有一个基于 PA 音频示例的相当大的应用。  它在 K2G 上运行、ARM 和 DSP 都运行 TI-RTOS。  我最近收到了第三方库的更新、这会导致我的 DSP 应用链接失败。  我正在寻求帮助、以了解如何避免这种情况。

故障:
只需将新库添加到链接行中、就会出现几个"错误#10099-D:程序无法放入可用存储器"错误。  我在 config.Bld 中有一个相当复杂的存储器布局。  失败消息告诉我链接器无法放置与 ARM 共享的区域。  我对可能导致这种情况的原因进行了调查,但没有结果。  新库不会(就我所能告诉的内容而言)定义本节中的任何内容。  我已要求供应商提供使用 v8.1构建的库、但这不是唯一的问题。

请注意、我的 config.Bld 有三个部分。  第一部分描述了共享区域。  然后是 ARM 和 DSP 的说明、每个说明都是指共享区域。  排除此库时、所有操作都将起作用。

版本:
我一直在使用8.1版编译器。  此新库是使用 v8.2构建的。  我怀疑存在一些兼容性问题。  我已经尝试使用 v8.2构建我的应用程序、但它无法解决关键问题。  链接仍然失败。  此外、我会收到数十条警告#10278-D  8.2编译器的自述文件将其称为"新编译器"、建议进行一些更改、但我还没有找到具体原因。

我注意到的其他差异:
当我使用 nm6x 转储库内容时、我注意到一个差异、可能会向专家提出一些建议:
工作(较旧)的库有很多这类行:
    0x00000000 A{C816A2B1-EAF8-4575-8BD6-1079DA21DDEF}
而新的则具有以下内容:
    0x00000000 A TI2oI3mLqrt
这表明这种建筑的一些东西是不同的,但除了所有的调试材料,我发现没有吸烟枪。  

虽然 Linux 实用程序"readelf"将转储有关 v2.2.2版本的信息、但相同的工具会报告  

readelf:错误:m.lib:找不到有效的存档标头

同时、Linux 实用程序 objdump 会处理这两个文件。  每个文件都被报告为"文件格式 ELF32-Little "。
我的系统中的所有其他库都不能被"readelf"读取。

文件"ti-cgt-C6000_8.2.2/closed_fines.html"注意到"CodeGen-3597   ELF 头字段 e_phoff 在不存在程序头时应为0"。  但这并不能解释我的实际链路错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因为...

    [引用 user="Chuck Peplinski "]将新库添加到链接行会导致多个错误"error #10099-D:program will not fit into available memory"错误。

    (笑声) 更新后的库可能比以前使用更多的存储器。  请使用 CG_xml 包中的实用程序 secti 来估算库使用的内存量。  我说"估计"是因为这种方法测量了库中所有函数使用的内存量。  仅测量主应用程序实际调用的函数更准确。  但这种测量更简单、并且通常足够接近、可以进行类似这样的比较。  测量库的旧变体和新变体使用的内存。  如果它上升、则这可能是您问题的原因。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答。 secti 工具很有趣、但问题并不简单。 实际上、新库具有更少的代码和更少的未初始化数据。 它具有稍多的初始化数据。 但在地图上有足够的空间。 链接器发生故障的段是共享存储器段。 该库中不放置任何代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更多信息:库提供程序使用早期(匹配)工具链版本重新编译、问题消失了。 具体而言、他说:
    *我看到8.1.8和8.1.3之间的 readelf 差异、即使使用完全相同的编译器设置也是如此。
    *我还在 Windows 上构建了此版本、我们通常在 Windows 上使用 Linux。
    *我添加了-gcc 选项、该选项被视为已弃用、现在应该是 relaxed_ansi 选项
    *我添加了--abi=eabi,它也是默认值,从8.1开始已不再使用

    这证实了8.1.3和8.2之间存在一些模糊的不兼容性、但我们无法确切地说什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉。  在您的第一篇帖子中,我忽略了一个关键的细节...

    [引用 user="Chuck Peplinski ]'我使用的是编译器的8.1版。  此新库是使用 v8.2构建的。  [/报价]

    链接器的版本必须与用于编译链接中组合的所有目标文件和库的编译器版本相同或更新版。  链接器版本为8.1.x、但此库使用版本8.2.x  不支持此功能。  8.2.x 库可能(在本例中很可能)包含8.1.x 链接器无法识别的内容。   

    有两种解决方案。  将链接器升级到8.2.x 版或更高版本。 或者、将用于构建库的编译器降级到8.1.x 版  您已经尝试了第二种解决方案、它似乎正在工作。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。 我是否错过了文档中所述的内容?