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.

[参考译文] CCS-AM243X:MCU-PLUS-SDK 显示不存在的符号

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1383416/mcu-plus-sdk-am243x-ccs-shows-non-existent-symbols

器件型号:MCU-PLUS-SDK AM243X

工具与软件:

您好!

我们使用的是 MCU PLUS SDK 09.01、CCS 12.5和 tiarmclang LTS 3.2.0、我也使用 LTS 3.2.2尝试此功能、因为存在这个问题: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1341376/mcu-plus-sdk-am243x-combination-of-__attribute__-weak-and-section-produces-two-symbols/5151847?tisearch=e2e-sitesearch&keymatch=%252520user%25253A453845#5151847

因此、想法是仅使用我们自己的中断处理程序、而不是 SDK 的中断处理程序。 我的第一个尝试是声明 sdk-abort-handler 为 weak。 过去或现在都存在问题、我们在上面的链接中处理了该问题。 toolchain-update 没有解决此问题。 遗憾的是、弱符号没有以某种方式被覆盖、具体取决于 project-link-order。 我们的解决方案是删除这些中止处理程序符号。 这是不可能的、如此处的相关主题中所述。
替代方法是重命名它们、但它们将保留在编译中。 但到目前为止、我们的异常中断处理程序被调用了。 我们将其重命名为中止处理程序的名称+"_unused"。

我们按以下方式对符号进行了重命名:

tiarmobjcopy --redefine-sym HwiP_reserved_handler=HwiP_reserved_handler_unused 
--redefine-sym HwiP_undefined_handler=HwiP_undefined_handler_unused
--redefine-sym HwiP_prefetch_abort_handler=HwiP_prefetch_abort_handler_unused
--redefine-sym HwiP_data_abort_handler_c=HwiP_data_abort_handler_c_unused
<path_to_sdk_libs>/freertos.am243x.r5f.ti-arm-clang.release.lib

我们仅使用静态编译的 SDK-library 来重命名符号。 这是唯一链接到我们目标的库、因此任何符号都不可能以某种方式重新出现。

CCS 仍然存在问题:

CCS 显示旧的和新的异常中断处理程序:

我们的目标是以":"开头的目标。 请注意、错误地址为0xA52! 这一点很重要。

但这没有任何意义。 只有中止处理程序符号出现在映射文件和 readelf 中。 也会出现"_unused"符号:

在映射文件中:

但地址0x00000A52处的任何符号都没有定义。 仍然、如果我单击这里、它将打开 sdk-c-file:

另一方面、如果您看一下分解、对于该0xA52-address、它会正确显示未使用的符号?!

我们还注意到、当我们从闪存启动并运行中止时、CCS 会准确显示这个"错误"函数、它在编译中不是可用的符号。 我们对这种情况如何发生感到困惑。

在 SDK 中删除处理程序并在 CCS 中正确显示处理程序的正确方法是什么? 还是从一开始就出现了问题?

此致

Felix

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

    Felix、您好!

    感谢您的提问。

    我将把您的疑问发送给 CCS 团队以便获取注释。 请在几个工作日内回复。

    此致、

    Tushar

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

    我已将该线程提请编译器专家的注意。

    请注意,美国度假期间,回复将延迟。  

    感谢您的耐心。

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

    本线程中讨论的问题与 您开始的其他线程中讨论的问题有一些相似之处。  我建议我们先解析不同的线程、然后回到这个线程。

    谢谢。此致、

    -George.

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

    感谢大家。

    在乔治的帮助下,我可以解决这个问题。 不知何故、即使在 readelf 和映射文件中没有看到符号、它仍然存在。 在乔治的帮助下,我们能够以正确的方式替换异常中断处理程序。 这也解决了这个问题。 解决方案如下:
    e2e.ti.com/.../5313715