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/F28M36H33B2:使用链接器命令将.lib 映射到不同的位置

Guru**** 2513185 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/651567/ccs-f28m36h33b2-mapping-lib-to-different-locations-using-linker-command

器件型号:F28M36H33B2

工具/软件:Code Composer Studio

您好!

注意:请忽略帖子中的器件型号、此问题出现在尚未编辑的产品上

在安全模块验证期间、我们需要将相同的.library 映射到 SRAM 中的两个不同存储器区域。  使用 了如下所示的器件。 lib_z1按预期进行映射、但对于 lib_z2、仅完成部分映射。 由于子函数在两个库中是通用的、因此链接器会对其进行优化。

我们如何强制链接器在两个存储器区域中完全映射两个库。 这是必需的、因为一旦启用了安全性、每个区域都将需要其库的完整副本。

 flashapi1 :>> RAMGS8 | RAMGS9,page = 1
   { lib_z1.lib (.text)
 lib_z1.lib (.econst)
lib_z1.lib (.cinit)
 lib_z1.lib (.ebss)

 flashapi2 :>> RAMGS4 | RAMGS5,page = 1
   {
 lib_Z2.lib (.text)
lib_Z2.lib (.econst)
 lib_Z2.lib (.cinit)
 lib_Z2.lib (.ebss)
   }

此致、

-PrashJ

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

    如果我理解正确、两个库 lib_z1和 lib_z2都包含一些相同的函数和数据。  您希望链接器包含这些函数和来自这两个库的数据。  链接器不支持该功能。  我将以一个有争议的示例进行解释。  首先、我将讨论它的工作原理。  然后、我将讨论如何更改链接器以及导致的问题。

    它现在是怎么工作的... 假设 lib_z1和 lib_z2都定义了名为 lib_fxn 的函数。  主应用程序调用 lib_fxn。  这会创建对 lib_fxn 的开放引用。  链接器首先看到 lib_z1。  由于对 lib_fxn 的开放引用、且 lib_z1具有该引用、因此引入了定义 lib_fxn 的文件。  这会关闭对 lib_fxn 的引用。  当看到 lib_Z2时、没有对 lib_fxn 的开放引用、因此其中定义 lib_fxn 的文件不会引入。   

    如何更改链接器... 假设有某种方法强制链接器从 lib_Z1和 lib_Z2引入 lib_fxn。  现在、您有一个具有两个地址的符号。  一个在 RAMGS8中、另一个在 RAMGS4中。  考虑在主应用程序中调用 lib_fxn。  调用 lib_fxn 时使用什么地址?  这是如何工作的?

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    我了解链接器删除重复函数的原因和方式。 还同意这完全有意义。 但是、我们在这里有 一种独特的情况、 认为它是有效的情况、用户应该能够使用特殊命令通知链接器以允许重复。

    有效原因是器件安全、当 在器件上启用时、从 RAMGS8执行的代码将无法访问 RAMGS4中的任何代码、反之亦然。 现在、我看到的是从 GS8执行并调用一个显然链接器已放入 GS4的函数时、代码会挂起。

    一种解决方法是为 lib1和 lib2维护两个源代码副本、确保函数/变量具有不同的名称(基本上是所有符号)、尽管它们会执行相同的操作。

    请告诉我您的想法。

    谢谢、此致、

    -PrashJ

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

    [引用 user="kjk"]但是我们在这里看到 的是一种独特的情况, 认为它是一个有效的情况,用户应该能够使用特殊命令通知链接器以允许重复。

    您可以。  但不能与 C 一起使用、因为它通常被使用。  我首先考虑推荐使用 C++名称空间的解决方案。  但是、正如我一直想的那样、我意识到您可以在 C 语言中执行类似的操作

    一个警告… 我从未使用过这种方法。  我确信主要的想法是声音。  但细节可能需要进行一些调整。

    下面是实际上如何在两个不同的地址实现一个名为 lib_fxn 的函数。

    首先、库实现源文件具有类似于…的内容

    #ifdef building LIB_Z1
    int lib_Z1_lib_fxn (int arg1、int arg2)
    #elif building_LIB_Z2
    int lib_Z2_lib_fxn (int arg1、int arg2)
    #else
    #error 必须定义预处理器符号 building_LIB_Z1或 building_LIB_Z2
    #endif
    {
    //此处输入代码
    } 

    为 lib_Z1构建此源文件时、请使用命令行选项–DBUILDING_LIB_Z1。  为 lib_Z2构建此源文件时、请使用–DBUILDING_LIB_Z2。

    在主应用程序代码或另一个库中、您需要 lib_fxn 的接口。  它看起来像…

    int interface_lib_fxn (int arg1、int arg2)
    {
    如果(使用_lib_z1)/*我认为这样一个运行时测试是可能的*/
    lib_z1_lib_fxn (arg1、arg2);
    其他
    lib_Z2_lib_fxn (arg1、arg2);
    } 

    在主应用程序代码中、您目前在其中写入 lib_fxn、而写入…

    interface_lib_fxn (arg1、arg2); 

    我更喜欢将此接口设为显式接口。 当然、如果您愿意、可以将函数 interface_lib_fxn 命名为 lib_fxn、然后主应用程序代码中的调用无需更改。

    使用这种方法、库的用户具有一致的界面、而工具在不同的位置看到两个不同的函数。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    是的、我已经具有用于连接库中的函数的#ifdef。 正如我在前面的帖子中提到的那样

    "一种解决方法是为 lib1和 lib2维护两个源代码副本、确保函数/变量具有不同的名称(基本上是所有符号)、尽管它们会执行相同的操作。"

    但是、当链接器正在优化 lib_z1_lib_fxn 和 lib_z2_lib_fxn 正在调用的所有子函数时、问题会稍微复杂一些。 因此、实际上、我必须为每个符号(函数和变量、结构、枚举等)重新声明具有_Z1/_Z2后缀的内容。


    这是唯一的出路吗?

    谢谢、此致、

    -Prashanth JayaPrakash

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

    您必须遵循的主要规则:每个全局符号(无论是函数还是数据)必须只对应一个地址。  所有全局符号都必须遵循此规则、无论它们是在主应用程序代码中定义的还是在库中定义的。  此规则来自 C 语言。  所有工具基础设施都取决于它。

    使用我们讨论过的技术只会使组织工作变得更容易、并避免某些重复。  C++名称空间是这些行中的另一种解决方案。   

    谢谢、此致、

    乔治

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

    谢谢乔治,我们必须使用令人窒息的符号。 但我仍然认为我们应该在链接器中有一个开关、这是一个专门用于故意复制函数的特殊命令。 (请注意,在从一个安全区域执行时,函数调用不能转到在另一个区域中复制的同一函数)。 这实际上意味着链接器应了解安全存储器区域、这是一种指示 IT 用户段的方法{}。 这将简化开发、尤其是安全性已成为 MCU 的组成部分。

    我们可以关闭此帖子。 感谢大家的观看。 新年快乐!

    谢谢、此致、

    -Prashanth JayaPrakash