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:链接多线程RTS库时链接器警告#1.7003万-D。

Guru**** 2568585 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/593751/compiler-tms320c6678-linker-warning-17003-d-when-linking-with-multithread-rts-library

部件号:TMS320C6678
“Thread:SysBIOS”中讨论的其它部件

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

环境:

  1. CCS 7.1 .............0内部版本16
  2. CGT 8.1 ……3.
  3. SysBIOS 6.50

现象:

  1. 我有一个SysBIOS项目,当我使用RTS库的非多线程版本时(不提供链接器参数'--multilthread'),我可以成功创建并运行该项目。
  2. 当我链接多线程RTS库时,我收到如下所述的链接警告:

  • "errno.c",第87行:警告#1.7003万-D:从函数"__c6xabi_errno_addr"重定位到符号"__errno"溢出;24位重定位地址0x8376dc太大,不能在15位无符号字段中找到(类型='R_C6000_TPR_U15_B',错误= 38\mt_cclib_ccdr_scr7000<rbi_scrbi_scrfelf = 8.1 =
  • 警告#1.0015万-D:无法在目标系统上加载和运行输出文件"xxx.OUTP"。

我检查了libsrc文件夹中的errno.c和errno.h。 我可以看到__errno符号是使用“__far”的_data_access定义和声明的。

由于__errno的memmodel已经很远了,应该可以在不使用DP的情况下从任何地方访问它,但为什么我会收到上面列出的链接警告?

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

    你好,canfoderiskii,

    我怀疑您在定义__errno符号的位置与多线程库认为它的位置之间存在冲突。

    C6x Cv.3 8.1 中的RTS库源 代码显示了__errno的以下定义:

    /*------------------ */
    /*通过__TI_USE_TLS */控制'errno'的内部实现
    /*符号。 对于线程安全库,将为__errno指定__thread*/       
    /*限定符(使其成为TLS)。 对于非线程安全库,__errno是     *
    /*定义为标量int。                                                  */
    /*------------------ */
    __TI_TLS_DATA_DEF (外部,int,__errno,0);

    您是否独立于RTS库编译errno.c? 如果是,您是否使用--multilthread编译它? 多线程RTS库假定在线程本地存储(也称为TLS)中定义了__errno。 假定每个线程在 多线程应用程序中都有自己的__errno副本。 因此 ,每个线程必须负责处理在其线程执行过程中出现的任何错误代码。 例如,如果应用程序创建线程X,则在线程X的 __errno副本中设置的任何错误代码都必须由线程X中执行的代码处理

    重定位类型"R_C6000_TPR_U15_B"假定__errno是在TLS块中定义的,该TLS块在创建当前线程时分配并初始化。 显然,在TLS块中未定义__errno,因此链接程序在TLS块开头的范围之外的位置找到其定义。 因此,重定位溢出。

    如果可能,是否可以提供通过 上述链接尝试生成的链接程序映射文件? 从映射文件中了解'__errno'或'errno'定义 的位置会很有用。

    此致,

    Todd Snider

    编译器组

    德州仪器(TI)公司

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

    1.我没有单独编译errno.c与RTS库,我链接了CGT附带的RTS库。
    2.这里是我的.map文件:

    e2e.ti.com/.../GPImgProcBrd_5F00_test_5F00_exec.zip

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

    从映射文件中,__errno在地址0x0.8376万dc处定义,该地址恰好是重定位溢出警告报告的值。

    与.tdata部分开头相对的__errno's偏移为0,这是应该分配给符号__errno的值

    请注意,__TI_TLS_block_size是0xffffffff (或-1)。 这意味着由于某种原因,链接程序认为没有必要创建TLS块。

    很遗憾,我无法确定为什么会出现这种情况,除非我尝试重现您的链接尝试行为。

    您能否收集用作链接输入文件的目标文件和对象库,并将它们与您可能使用的任何链接程序命令文件以及用于调用链接的链接命令一起发送?

    如果您更愿意在离线状态下提供此信息,您可以通过e2e论坛向我发送朋友请求,我们将了解如何继续。

    此致,

    Todd Snider

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

    我解决了这个问题。 我为SysBIOS项目添加了一个额外的.cmd文件,在该文件中添加了3个部分的位置定义:.TITLS,.TILS_INIT,.tdata。 然后链接成功完成。
    我记得链接器能够将部分分配到默认内存中,而无需用户指定。 为什么此链接器的功能在这种多线程情况下不起作用?

    但是,这里出现了另一个问题。即使我在.cmd文件中指定了.tdata部分,我仍然收到如下所述的链接器警告:
    警告#1.0247万-D:创建不带节规范的输出节".tdata"。

    我可以在.map文件中的某个位置找到.tdata。 这个新问题对我来说很奇怪。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    canfoderiski 说:
    尽管我在.cmd文件中指定了.tdata部分,但我仍然收到链接器警告

    在下一篇文章中,请附加指定.tdata输出部分的链接器命令文件。  因此,论坛将接受它,添加文件扩展名.txt。

    谢谢,此致,

    -George

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

    添加的额外链接程序.cmd文件很简单:

    部分
    {
    TI.TLS > L2SRAM
    .TI.TLS_INIT > L2SRAM
    .tdata > L2SRAM
    }
    

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

    你好,Canfoderiskii,

    我同意,当链接程序命令文件中已经有一个输出节时,链接程序不应生成有关创建.tdata输出节的警告。

    tdata输出部分是否至少按照您的要求放置在L2SRAM内存区域内? 如果不是,则在链接程序分析链接程序命令文件时处理.tdata输出部分规范时出现错误。

    我将尝试用几个示例测试用例复制警告行为,以查看我是否可以确定问题的根源。 如果我无法重现您所看到的链接器行为,我可能需要从您那里获得更完整的测试案例(如果需要,我们可以脱机执行此操作)。

    ~ Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Todd,您好!
    我在链接程序命令文件中将.tdata更改为MSMCSRAM,链接程序成功地将.tdata部分放置到我想要的位置。 但是会生成关于.tdata的相同警告。