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.

[参考译文] 编译器/TMS320F28377S:链接器命令文件:组库段

Guru**** 2614265 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/647988/compiler-tms320f28377s-linker-command-file-group-library-sections

器件型号:TMS320F28377S

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

我需要将一些段组合在一起、包括库中的段。 我尝试遵循中所述的分组/命名建议

http://processors.wiki.ti.com/index.php/Linker_Command_File_Primer

我的链接器命令文件的提取:

部分

MyLibrary

-l.\path\to \my\library.lib (.text)

组:>> RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4,页= 0

.text

MyLibrary

.cinit

.econst

问题是 MyLibrary 放在.cinit /.econst 段之后。

问题:

1) 1)如何对段进行分组、以便按如下顺序进行排序:

.text

MyLibrary.text

.cinit /.econst

2) 2)我已经阅读了可以在 文件顶部定义-l.\path\TO\my\library.lib、然后只需使用名称 library.lib。 我需要在何处/如何定义它?

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

    考虑这些行,它们出现在集团外部...

    [引用 user="DSPGER"]

    MyLibrary

    -l.\path\to \my\library.lib (.text)

    [/报价]

    这意味着创建一个名为 MyLibrary 的输出段。  它的输入段是 MyLibrary.lib 中的.text 段。  未指定分配、因此链接器默认会分配分配分配。  虽然这是合法的语法、但这样做是不明智的。

    当您在组中写入 MyLibrary 时... 这意味着创建一个名为 MyLibrary 的输出段。  允许使用同名的多个输出段、但通常是一个错误主意。  它由所有也称为 MyLibrary 的输入段组成。  我确定没有任何内容、因此该输出段为空。   

    若要修复它、请删除"组"之外的"我的库"部分。  在组内,在 MyLibrary 行之后,写这个...

    [引用 user="DSPGER"]

    -l.\path\to \my\library.lib (.text)

    [/报价]

    [引用 user="DSPGER"]2)我已经阅读过、可以在 文件顶部定义-l.\path\TO\my\library.lib、然后只需使用名称 library.lib。 我需要在何处/如何定义它?

    这是一个偏好问题。  链接器需要了解3个方面。

    1. 库的名称
    2. 库所在的目录
    3. 什么输出段从库获取输入段

    提供此信息的方法有多种。  本入门文章显示了其中一个。  您会显示另一个。  另一 个示例显示在 C28x 汇编工具手册中标题为"将库或存档成员指定为输入到输出"的部分中。  使用您认为会使链接器命令文件更易于使用的任何方法。

    谢谢、此致、

    乔治

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

    您好、George、

    喜欢这个吗?

    组:>> RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4,PAGE = 0
    {
    .text
    MyLibrary
    {
    -L...\path\o\my\library.lib (.text)
    }
    .cinit
    .econst
    } 

    我之前已经尝试过这种方法、链接器将 MyLibrary 放在.text 之前:

    文本段.text (小端字节序)、0x00008835
    文本段 MyLibrary.1 (小端字节序)上的0x460字、0x00008000
    文本段 MyLibrary.2 (小端字节序)上的0x800字、0x00008800
    数据段.cinit (小端字节序)上的0x35字、0x00008c95上的0x18字 

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

    [报价用户="DSPGER"]是否如此?

    是的

    [引用 user="DSPGER"]我之前已经尝试过此操作,链接器将 MyLibrary 放在.text:之前

    这是因为 GROUP 和 SECTION (>>语法)具有交叉作用。  分段胜出。  段拆分表示可以在输入段边界上将输出段或 GROUP 拆分为多个段、并尝试将这些段尽可能小的存储器中。  组通常施加的排序被忽略。

    如果您真的需要按该顺序输出段.... 我只看到一种方法来实现它。  这些内存范围很可能是这样定义的...

    RAMLS0:origin = 0x008000、length = 0x000800
    RAMLS1:origin = 0x008800,length = 0x000800
    RAMLS2:origin = 0x009000、length = 0x000800
    RAMLS3:origin = 0x009800,length = 0x000800
    RAMLS4:origin = 0x00A000、length = 0x000800
    

    这些存储器范围都相邻。  将它们折叠到单个内存范围...

    RAMLS0_4 :origin = 0x008000、length = 0x002800 

    然后编写您的组...

    组> RAMLS0_4
    {
    /*与以前相同*/
    } 

    显然、RAMLS0等的任何其他使用都需要类似的更改。

    请注意、这意味着函数或数据将开始跨越0x800地址边界。  我认为没有理由对此感到关切。  但可能有吗?

    谢谢、此致、

    乔治

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

    不是我想得到的答案、而是很好地知道。 谢谢。

    [引用用户="George mock"]

    请注意、这意味着函数或数据将开始跨越0x800地址边界。  我认为没有理由对此感到关切。  但可能有吗?

    [/报价]

    不确定。

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

    您可以将存储器折叠在一起并跨越边界。 这不会给您带来任何问题。

    此致
    Chris