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.

[参考译文] MCU-PLUS-SDK - AM243X:当多个同名的段放入链接器文件中时、与 tiarmclang 链接会产生错误

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1562881/mcu-plus-sdk-am243x-linking-with-tiarmclang-produces-error-when-multiple-sections-with-the-same-name-are-placed-in-the-linker-file

器件型号:AM243X - MCU-PLUS-SDK


工具/软件:

您好:  

我希望标题能很好地匹配这个问题。  

因此、我们的情况是我们使用 MCU-PLUS-SDK、我们希望覆盖一些函数、虽然这对大多数驱动器来说效果很好、覆盖一些 DPL 功能并不能按预期正常工作。 我得到了 George 的一些指导、帮助大家了解链接器的工作原理 :AM243X-AM243X:“不要剥离符号 X、因为它在重定位中命名“-基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI MCU-PLUS-SDK 支持论坛
在重新定义您自己的库中的实现时,我们还修复了链接段的问题,但您提到了两个库 — 其中包含要覆盖的函数的库以及您自己的库,其中明确提到了包含覆盖 MCU-PLUS-SDK 功能的章节 的库:SDK-AM243X:使用自己的实现功能覆盖 SDK-functions 无法正常工作 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

在上述情况中、我们确实覆盖了中止处理程序、但现在我们要覆盖一些调试功能。  

到目前为止,我设法,林克没有抱怨重新定义的 smybols,所以这似乎是有效的。 此示例的文件夹结构如下:

这些.c 文件是从 SDK 复制的并包含修改后的内容、但仍定义了将被覆盖以包含在一个编译单元中的所有函数。  

修改也会影响这些部分、因为我们会将其中一些函数放在这样的特殊.text.debug-section 中(标题激活此部分,只是 VSCode 不能正确显示):

请注意、在 SDK 中、这些函数不会放在这样的部分中!

现在、重要的部分发生了、这在链接器脚本中有点特殊。

我们将 FreeRTOS 库放置在一个部分中、该库包含要覆盖的符号:

.text.debug-section 还位于:

如果我现在在不做进一步修改的情况下进行编译、我们的.text.debug-section 不包含这些符号。 相反、映射文件显示包括 FreeRTOS 库中的那些:

我们的库在 FreeRTOS 库之前的链接命令中链接。 从链接命令中提取:

一旦我从链接器脚本中删除 freeRTOS-library、它就会有效并使用我们库中的文件副本:

但一旦我再次添加 freertos-lib、并尝试像添加其他解决方案一样添加它:

我在链接时收到此错误:

linker_r5f_mcu1_0_freertos_debug.cmd", line 63: error #10068-D: 
   no matching section

这对我来说毫无意义、因为这个部分显然在这个库中。  

它甚至会更加令人困惑、因为当我现在再次删除 freeRTOS 库时、它会再次编译、并将我们的部分放在那里、同时添加了 libti_hw_support-mcu1_0.a 的显式放置!

为什么链接器显示没有匹配的部分、而即使有一个、它也会使用它? 该消息是否只是另一个问题的指标?
我猜是因为 SDK 中的函数没有.text.debug-section-attribute、所以它们在输入部分的定义有所不同、所以链接器会以不同的方式处理它们?

我在这里做什么?

编辑:我通过删除我们的 section-attributes 进行了测试、然后可以在链接器脚本中包含这两个库。 因此、将这些函数放在 SDK 之外的单独部分中似乎是问题所在。  
不幸的是,我们有一个原因,为什么这是需要的,但它是一段时间前,我会发现.  

是否可以同时将 SDK 库函数放置在与 SDK 中函数不同的部分中替换这些函数?

此致、  

Felix

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

    我有一个建议。  我不能肯定这是切实可行的、也不能确定它是否解决了问题。  但我认为这是值得考虑的。

    更改调用链接器的命令、以便在所有库之前命名所有目标文件。  按照将函数置于 FreeRTOS 中同名函数之前的顺序对库进行命名。  所有链接器选项 -- reread_libs 、将其删除。  添加链接器选项 --优先级 。   

    如果这样没有解决问题、请在文本文件中捕获链接器调用的文本(而不是屏幕截图)、并将其附加到下一个帖子中。   

    谢谢。此致、

    -乔治

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

    嘿、George、  

    好的、有时需要在稍后处理。 我们仍需要修复的链接顺序  --优先级 、因为我们仍然使用 -- reread_libs 选项。
    我认为、我们需要将这些内容放入额外部分的问题是、因为我们使用 DDR-RAM、而不是内部 RAM。 我们对 RAM 的初始化时序有一些问题、因此我们需要创建额外的段、这些段在内部 SRAM/TCM 中分配、以便将这些功能放置在此处并足够早可用。 我认为主要问题是在_mpu_init 内为我们调用了其中一个函数。  
    我越想一想、我们现在甚至可以从链接器脚本中删除 freeRTOS 库、因为当我们提到我们的库时、这个库似乎有效。  
    但我需要检查这是否足够。  

    尽管如此、我们需要修复链接顺序。 再次感谢您的提示、我们将尝试尽快解决此问题。  

    当我能够验证我们现在的解决方案是否已经足够时、我将再次回来。  

    此致

    Felix

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

    嘿 George,所以我修正了我们的链接顺序,并能够使用 — 优先级。  
    我还更新为适用于 AM243x 的最新工业通信 SDK。  
    我没有深入研究、但似乎不需要在链接器脚本中显式设置库来考虑.text.debug 中定义的符号。  
    所以可能--reread_libs 是这里的问题。
    由于我们使用 CMake、并且 SDK 本身不支持 CMkae、因此需要将 SDK 的 make 调用封装在 CMake 内 并提供这些库(按正确的顺序,因为有些库从 SDK 的根具有相同的包含路径、尤其是对于 ICSS_EMAC,它存在两次,会造成很多混乱)。
    但现在、我想我们已经为 SDK 创建了一个很好的、可正常工作的 CMake-API。  
    它是有效的。 感谢您的帮助和意见!

    此致

    Felix