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.

[参考译文] 编译器/TMS570LS3137:使用残桩作为函数的 CCSV8、链接器错误#10056

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/849372/compiler-tms570ls3137-ccsv8-using-stubs-for-function-linker-error-10056

器件型号:TMS570LS3137
主题中讨论的其他器件:TMDS570LS31HDK

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

开发套件:"TMDS570LS31HDK Hercules 开发套件"

CCS 版本 CCV8。

编译器工具链: TI-CGT-ARM_18.1.0.LTS

对于编写测试、我需要提供在一个或多个源文件中实现的函数(一个或多个)的存根。 我使用了'--gen_func_subsections '编译器选项将每个函数放在其自己的段中、并查看.lst 文件中的效果。 我还显式使用了链接器选项'--unused_section_elimination=on',即使默认设置始终为 on。 但在链接期间、我仍然会得到错误#10056符号重新定义错误。 使用选项--diag_warning=10056或--diag-remark=10056不会将错误降级为警告或备注。

在实际 obj 实现实际功能之前、我有 stub obj、因此该 stub 应链接到 out 文件中。

如何抑制10056误差并使存根在链接期间优先于实际实现?

我曾将此线程称为"https://e2e.ti.com/support/tools/ccs/f/81/t/218808?tisearch=e2e-sitesearch&keymatch=stub%2010056"、但该线程中的建议是将每个函数放在其自己的源文件中是无用的。

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

    如果在同一链接中的两个目标文件中定义了相同的函数、则重新定义符号的错误是不可避免的。

    以下是处理该问题的其他两种方法、它们可以解决您的问题。  在本说明中、我将调用一个函数定义主函数和另一个函数定义辅助函数。  在描述的条件中、两次定义相同的函数并不是错误、并且使用了主函数。

    一种方法... 使次级定义较弱。  您可以使用#pragma weak weak 函数属性执行此操作。  TI ARM 编译器手册中介绍了这两种方法。  搜索它以查找弱项。   

    另一种方法... 次要定义位于库中的目标文件中。  如果存在主定义、则会使用它。  如果不存在主定义、则会使用库中的次定义。

    谢谢、此致、

    乔治

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

    谢谢你、George。 建议的解决方案对我来说是行不通的。

    主要定义位于无法修改的代码中、即实际源代码。

    存根可能具有弱绑定、但在这种情况下不会链接存根。

    我不是 CCS 或 TI 编译器工具链的专家、但希望在第一个定义中遇到链接这样更简单的问题、如果用户决定不允许重新定义(如实际源代码中)、则会发出警告、该警告会提升为错误 但可以在测试中使用它。

    没有其他方法?

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

    考虑使用链接器选项 --symbol_map。  请在 ARM 汇编工具手册中搜索它。  在您的情况下、请使用-symbol_map=primary 等类似内容。   

    谢谢、此致、

    乔治