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.

[参考译文] 如何在链接命令文件中指定段的顺序?

Guru**** 2589275 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1014989/how-to-specify-the-order-of-sections-in-link-command-file

您好!

下面是链接命令文件。 我想将所有 r 和 Rx 代码段、如 interrupt、text、const、init 表 放置在 CODE_DATA_MEMORY 的开头、然后将所有 RW 数据段放置在代码段后面。 现在问题是链接将失败。 问题是什么? 为什么失败?  

如果将.cinit 移出 CODE_SECTION、只需使用、  

.cinit                 >       CODE_DATA_MEMORY

然后 .cinit 将位于 DATA_SECTION 的后面、这不是我想要的。

错误#10247-D:在没有 SECTIONS 规范的情况下创建输出段".cinit"

MEMORY
{
   CODE_DATA_MEMORY  : org = CODE_DATA_MEM_ADDR,     len = CODE_DATA_MEM_LEN
}

SECTIONS
{
   code_section :
   {
      *(.intvecs)
      *(.text)
      *(.const)
      *(.cinit)
   } > CODE_DATA_MEM_ADDR

   data_section :
   {
      bss_start = .;
      *(.bss)
      bss_end = .;
      
      *(.data)
      *(.cio)
      *(.sysmem)
      
      __stack_start = .;
      *(.stack)
      __stack_end = .;
      __STACK_SIZE = __stack_end - __stack_start + 1;
            
   } > CODE_DATA_MEMORY
}

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

    您可以使用 GROUP 指令来控制顺序。

    https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html

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

    遗憾的是、唯一的解决方案是创建两个单独的存储器范围。  所有初始化的段、如.text、都进入一个存储器范围。  所有未初始化的段、如.data、都进入另一个存储器范围。

    例如...

    MEMORY
    {
       /* Change to match your system */
       INITIALIZED     : o = 0x1000, l = 0x3000
       NOT_INITIALIZED : o = 0x4000, l = 0x3000
    }
    
    SECTIONS
    {
        .intvecs > INITIALIZED
        .text    > INITIALIZED
        .const   > INITIALIZED
        .cinit   > INITIALIZED
    
        .bss     > NOT_INITIALIZED, START(bss_start), END(bss_end)
        .data    > NOT_INITIALIZED
        .cio     > NOT_INITIALIZED
        .sysmem  > NOT_INITIALIZED
        .stack   > NOT_INITIALIZED, START(__stack_start), END(__stack_end)
    }
    
    /* Do not overwrite __STACK_SIZE that is created by default */
    __MY_STACK_SIZE = __stack_end - __stack_start + 1;

    注意链接器会默认创建一个名为__STACK_SIZE 的符号。  欢迎您创建类似的符号、但它必须具有不同的名称。

    如果您想使初始化的内存范围足够大以适合这些段... 遗憾的是、唯一的方法是尝试和错误。  如果您使用此方法、请为其提供比绝对所需的更多的存储器、这样您就有一些空间让段变得更大。

    谢谢、此致、

    乔治