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.

[参考译文] 编译器/TMS320C6678:输出段".fardata"压缩时出现问题

Guru**** 2589280 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/611835/compiler-tms320c6678-problem-with-output-section-fardata-compression

器件型号:TMS320C6678

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

您好!

链接器会向我发出以下警告:

"输出段".fardata"是指加载符号"$C$SL61"、因此无法压缩"

其中有问题的符号来自库、并引用非 const 结构初始化中使用的字面量字符串。 如果我尝试删除对嵌入该字符串的编译模块的任何引用、则警告将移至另一个符号、始终是文字字符串。

我使用该库是大量项目、包括或多或少相同的目标模块、有时我会遇到此错误、但并非总是... 到目前为止、我无法区分产生问题的项目之间的差异。

我的链接器命令文件对输出段进行了排序、但我有一些非常相似的应用程序(即它们使用库中的相同模块)、具有不会生成警告的相同段顺序。

CGT:C6000 7.4.21 (但旧版本也存在问题)

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

    有关您的情况的完整说明、请参阅 此论坛主题。  这是一个长读。  这是您在特定情况下的含义。

    请记住、这是一个警告。  生成的生成工作正常。  但它使用的存储器多于理想的存储器。  如果您不关心这一点、则可以忽略该警告。

    符号$C$SL61用于.const:.string 段中的字符串常量。  因此、此问题的最可能原因是输出段.fardata 和.const (或.const:.string)位于同一组中。  如果是这种情况、一种解决方案是从 GROUP 中删除.const 并单独分配它。

    谢谢、此致、

    乔治

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

    .const 和.fardata 已在单独的组中。 由于"违规"符号只能由库在内部使用、因此我还尝试隔离库.const 和.fardata。 结果是无法压缩库.fardata (如预期的那样)、但也无法压缩应用程序.fardata。

    我看起来很奇怪、因为显然、与库的应用程序接口仅通过非内联函数进行、并且没有对库内部数据的引用。

    我想有一些"隐藏"的引用逃避了我的评论。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Alberto Chessa 说:
    .const 和.fardata 已在单独的组中。

    那么、我不明白为什么您会得到该诊断。  请将链接器命令文件附加到下一个帖子。  因此论坛将接受它、并将文件扩展名".txt"添加到它。

    谢谢、此致、

    乔治

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

    您好!

    我在附加文件时遇到一些问题。 由于它很小、我将其粘贴为代码:

    #define K (x_)(((x_)*1024)
    
    #define L2_base 0x00800000
    #define L2_IBL_reserved_size 0x20000
    #define L2_size (K (512)
    )#define L2_reserved_size(K (1))
    
    ) MEMORY
    {
    L2SRAM:O = 0x00000, L2_SRAM=64_SRAM+L (保留
    )
    
    
    
    :0x64_SRAM=064*1024 (保留)、L+L+64_SRAM=064_S=064_SRAM=L (保留)
    
    L=K (128*1024)
    
    DDR3_RAM:O=0x8000000000、L=K (512*1024)
    }
    
    #define CODE_MEM L2SRAM
    #define DATA_MEM L2SRAM
    
    #define FRATE_MEM DDR3_RAM
    
    SECTIONS
    {
    GROUP (CODE)
    {
    .text
    .const
    切换
    
    .cinit:align=0x010//////警告#10229-D:输出段".fardata"指加载符号"$C$SL23"、因此无法压缩;压缩"rle"会被忽略
    
    .app_signature:fill=0x00、align=0x100
    
    }> CODE_MEM
    
    Group (data)
    {
    .data
    .bss
    rodata
    .neardata
    
    .far
    fardata
    
    .stack:type=NoLoad
    sysmem:type=NoLoad 

    }> DATA_MEM //.cinit:align=0x010 > CODE_MEM//如果.cinit 放在此处,则问题消失 }

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

    问题是.cinit 和.const 位于同一个组中。  阅读 C6000编译器手册中题为"变量自动初始化"的部分、您将了解到.cinit 段是通过处理.data、.fardata 和其他包含初始化全局变量的类似段来开发的。  回想一下、.fardata 和.const 不能位于同一个组中。  因此、这扩展了.fardata 和.const 之间的依赖关系、以包含段.cinit。

    它重复了诊断是一个警告。  这不是错误。  生成的生成工作正常。  但由于缺乏压缩、它使用的存储器多于严格必要的存储器。  如果您正在达到内存使用量方面的目标、请考虑忽略警告。

    为避免此警告、.cinit 和.const 段不能位于同一组中。

    谢谢、此致、

    乔治

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

    如果我移动另一组中的.const、问题会转移到函数指针的静态初始化、这是.fardata 和.text 之间的相关性。 指针定义和函数对于同一编译单元都是静态的。

    我理解结果构建工作、到目前为止、尺寸不是问题。 我想简单地理解为什么在其他一些应用中不会出现警告、即使它们具有本质上相同的存储器布局并且使用相同的库模块。
    到目前为止、我无法确定产生警告的关键区别。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该警告由链接器触发、因为它已达到无法解算的依赖周期。

    .cinit 包含.fardata 等初始化段的压缩初始值。 为了执行压缩
    需要事先知道压缩段的大小和内容(也称为最终确定)。 假设数据段 A 包含一个变量、该变量的初始值是指向其他段 B 的指针。则在知道段 B 的位置之前、无法最终确定段 A。 这将创建一个排序;在 A 被最终确定之前、B 必须被放置。 现在假设 A 段是.cinit、B 段是.fardata、它们位于同一组中、以.fardata 为第二个。 现在、在放置.fardata 之前无法最终确定.cinit、但在已知.cinit 的长度之前无法放置.fardata、直到.cinit 最终确定(这是不可能的周期)才能知道该长度。 这只是最重要的例子。

    最简单的解决方案是不将.cinit 放入任何组。 有其他方法可以消除警告、但几乎所有方法都需要详细了解应用中的哪些部分涉及哪些其他部分、因此实际上没有"一个适合所有部分的答案"。