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/TMS320C6678:如何使用linker.cmd文件在一个项目中加载不同对象文件的相同部分

Guru**** 2587345 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/603878/ccs-tms320c6678-how-to-load-the-same-sections-of-different-object-files-within-one-project-with-the-linker-cmd-file

部件号:TMS320C6678

工具/软件:Code Composer Studio

您好,

我使用的是C6678。

我有一个应用程序是CCS项目应用程序,应用程序链接了基于静态库项目ort构建的ort.lib。 我要将ort.lib的.bss和.neardata设置为L2, 将app的.bss和.neardata设置为DDR。 因此,我将这些行添加到项目应用程序的linker.cmd中。

章节

    .localdata:

    {

        "ort.lib"(.bss)

       "ort.lib"(.neardata)

    } > L2

}

章节

   .bss > DDR

   .neardata > DDR

}

在构建项目应用程序后,我检查.map文件,我发现这些部分已按cmd添加到所述位置。 但是当我尝试打印初始化的本地静态变量的地址时,该变量在应用程序的源文件中使用printf("%x",&var)定义; 它不是一个像0x8xxxxxxx这样的地址,而是一个像0x88xxxx这样的地址,这是一个奇怪的地址。 那么,我的linker.cmd是否有问题?

如何将应用程序和ort.lib的某些相同部分放置到不同的内存段(其他一些部分在应用程序和lib中保持相同)?

谢谢!!

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

    ruijie yang 说:
    但是当我尝试打印已初始化的本地静态变量的地址时,该变量在应用程序的源文件中使用printf ("%x",&var)进行定义; 它不是像0x8xxxxxxx这样的地址,而是像0x88xxxx这样的地址,这很奇怪。

    该变量可能不在.bss或.neardata节中。  有关 编译器使用的节名称以及这些节名称包含的内容的说明,请参阅C6000编译器手册中标题为sections的部分。  另一种查看在ort.lib中使用的部分的方法是使用目标文件显示实用程序ofd6x。  C6000装配工具手册中对此进行了说明

    另一个关于不同但相关的主题的观点... 您不能像这样拆分.bss和.neardata。  因为这些变量都是在DP (数据页指针)寄存器的偏移处访问的,所以它们必须在一起。  请在 C6000编译器手册 中标题为数据内存模型的章节中阅读有关此内容的更多信息

    谢谢,此致,

    -George

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

    谢谢你,George,

    我已经阅读了您推荐的手册,但无法解决我的问题。

    1.首先,我希望确保我的目标能够实现。 如果我想按照我在第一篇文章中的描述,将.neardata (.neardata)放在ort.lib中的L2中,将.neardata (.neardata)放在应用程序中的DDR中,是否可以?  有没有办法这样做?

    2. 我想显示发生的一个奇怪的问题,我试图将静态变量定义为近似(静态接近int var), 但CCS似乎不能识别Near AS关键字,编辑窗口中的“near”不是红色和粗体 ,且该行左边缘有问号(关键字far正确标记为关键字)。 我 正在使用CCS 5.5。 不知怎么的,我无法显示屏幕截图抱歉。

    3.在我的第一篇文章中,我使用  

    章节

    .localdata

    "ORT.lib"(.neardata)  

    }  > L2

    }

    将ort.lib中的.neardata添加到L2。  因为我在CCS的omp演示“matrix”项目中使用linker.cmd。 在此cmd文件中,它将某些库的.fardata置于L2,而将其他对象的.fardata置于MSMCRAM。 您是否介意检查该linker.cmd并帮助我理解它?

    4.我尝试根据手册中的示例7-9和示例7-25修改我的cmd文件,但它不能按我预期的方式工作。 当我生成应用程序项目时,它会显示警告:

    #Section ".localdata"需要static_base相对重定位,但位于0x8000万,该位置可能超出 static_base的范围。static_base位于0x0087d000。可能需要更正 ".localdata"的位置,使其位于static_base的0x8000位置。

    #Relocation from function "main" to symbol "var" overloged";

    var是main()中的静态int定义。编译器似乎已通过将.localdata从static_base中放入0x8000内的地址来更正我在cmd中的设置。 是否有办法停止编译器执行此操作?

    非常感谢!! 希望你能帮我!

    瑞吉

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

    [报价用户="ruijie yang]1. 首先,我希望确保我的目标能够实现。 如果我想按照我在第一篇文章中的描述,将.neardata (.neardata)放在ort.lib中的L2中,将.neardata (.neardata)放在应用程序中的DDR中,是否可以?  有任何方法可以这样做?[/QUOT]

    这是不可能的。  来自任何对象模块的所有.neardata输入部分(包括来自库的部分)必须组合到一个名为.neardata的输出部分中(几乎总是)。  这是因为所有这些变量都是通过DP的偏移量访问的。  该偏移的大小限制为15位。  有关此主题的更多背景信息,请参阅 C6000 EABI应用报告 中标题为 数据分配和寻址的章节。  

    [报价用户="ruijie yang"]2.  我想显示发生的一个奇怪的问题,我尝试将静态变量定义为near (static near int var),但CCS似乎不能识别near as关键字

    这似乎是CCS编辑器中的一个错误。  对于标量全局变量,near是缺省值。

    因为我在CCS的omp演示“matrix”项目中使用linker.cmd。 在此cmd文件中,它将某些库的.fardata置于L2,而将其他对象的.fardata置于MSMCRAM。 您是否介意检查链接器.cmd并帮助我理解它?[/QUOT]

    可以将.fardata向上拆分为不同的输出部分。  该节中对变量的引用不依赖于DP。  有关链接程序命令文件的一般了解,请参阅文章 链接程序命令文件入门

    [报价用户="ruijie yang"]

    #Section ".localdata"需要static_base相对重定位,但位于0x8000万,该位置可能超出 static_base的范围。static_base位于0x0087d000。可能需要更正 ".localdata"的位置,使其位于static_base的0x8000位置。

    #Relocation from function "main" to symbol "var" overloged";

    [/引述]

    之所以会出现此诊断,是因为.localdata节包含通过DP偏移量访问的变量,但.localdata节却未分配给可在该DP偏移量内到达的内存范围。

    谢谢,此致,

    -George

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