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.

[参考译文] TMS570LS1114:tiarmclang:'A#39;引起与#39;B#39的段类型冲突;

Guru**** 2393725 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1054297/tms570ls1114-tiarmclang-a-causes-a-section-type-conflict-with-b

器件型号:TMS570LS1114

我有一个 CPP 代码、如下所示:

namespace app 
{ 
    /** 
    other code here 
    */ 
    const baseClass1::ChildClass myObjArr1[] __attribute__((section("lnkSHARED_DATA_SECTION")))= 
    {
    /* initlialization values go here */ 
    }; 
    /*un initialized array */ 
    baseClass2 myObjArr2[54] __attribute__((section("lnkSHARED_DATA_SECTION"))); 
    /** other code here */ 
}

tiarmclang 编译器(最新版本1.3.0LTS)提供如下所示的错误:
error: 'myObjArr2' causes a section type conflict with 'myObjArr1'
在互联网上搜索类似问题后,我遇到的所有问题都是编译器在尝试将初始化的数组(myObjArr1)放在.data 段中,而将未初始化的数组(myObj2Arr)放在.bss 段中时出现的问题。
 
但我的应用程序链接器脚本需要自定义命名的数据段(在这里称为 lnkSHARD_DATA_SECTION)。 应用程序具有使用#pragma DATA_SECTION 的旧代码、因此根据此 行的迁移文档和编译器诊断、我应该使用__attribute__((section ("scn_name"))而不是不受支持的#pragma (我确实这么做了)。 但问题是编译器以某种方式忽略了__attribute__命令!!
互联网上的一些建议暗示了-fno-common 编译器命令行选项强制编译器不建立公共链接、但这一点并没有改变!!
我的问题是:...
1 -我做了什么错?
2-如何正确迁移#pragma DATA_SECTION 以实现 相同的结果?  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将您的测试案例简化为以下几行 C 代码...

    const int const_array[] __attribute__((section("special_section")))
                        = { 1, 2, 3, 4, 5};
          int plain_array[] __attribute__((section("special_section")))
                        = { 1, 2, 3, 4, 5};

    当我构建它时、我会看到诊断: 错误:"plain_array"导致段类型与"const_array"冲突。  我访问 了编译器资源管理器 、并使用多种不同的编译器构建了此代码。  所有基于 Clang 或 GCC 的问题都有类似的诊断。   

    问题是编译器假定 const_array 进入闪存(或可能进入 ROM)、plain_array 进入 RAM。  由于这种差异、为初始化这些数组而发出的代码是不同的。  这些差异意味着它们不能位于同一个部分中。

    解决方案是将它们放在不同的部分中。  即使在链接器命令文件中、也可以将它们组合成不同的输出段。  虽然您可能会找到一种将这些输入段组合到同一输出段的方法、但这会带来比它解决的问题更多的风险。  您始终可以将每个输出段分配到相同的存储器范围。  但是、当您这么做时、您接受了解这些存储器位置在启动期间如何进行初始化的责任。

    谢谢、此致、

    乔治