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.

[参考译文] 编译器/DRA756:C66 Cv GT 8.1 3 Incremental Link问题

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/639358/compiler-dra756-c66-cgt-v8-1-3-incremental-link-issue

部件号:DRA756

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

我们发现C66 CGTv 8.1 3和增量链接存在潜在问题

随附了一些可重现该问题的文件。  文件中显示了一个图,显示了预期的流程。

每个文件都包含一个具有全局构造函数的对象:

Main.cppMainFile类型的对象

libFile01.cpp类型为LibFile01的对象

libFile02.cpp类型为LibFile02的对象(该对象使用pragma Retain实例化)。

仅执行对象MainFile和LibFile02的构造函数。

 

1.要复制,请 使用附加 的源文件和批处理程序compile2.bat来构建程序。 请将路径设置为包含在compile2.bat文件中。

2.对于gcc编译器(在x86和A15上),调用对象LibFile01的构造函数–批处理文件compile2_gcc.bat用于为PC构建程序。

3.   pragma Retain很可能会有所帮助,但是问题与第三方代码有关,我们甚至不能在一行中更改第三方代码。

4.如果您编译所有文件并在一个步骤中链接它们,则所有全局构造函数都将被调用–批处理文件compile1.bat

5.类似的问题在 http://e2e.ti.com/support/development_tools/compiler/f/343/p/20.2214万/721867上72.1867万上报告 ,并报告为solved.e2e.ti.com/.../2017.11.13_5F00_C66_5F00_Incremental_5F00_Link.zip

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

    我的分析不完整。  但我有一个问题,我确信这是核心问题。  为什么要建立增量链接?  为什么不将libFile01.obj和libFile02.obj放入库中,然后根据该库进行链接?  这是组织具有多个图层的构建的更典型的方法。

    谢谢,此致,

    -George

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

    您好!

    感谢您的回答。 如果链接到库,则不会调用库中的全局构造函数,尽管pragma retain是这样。 下面是关于递增链接的有趣讨论。 明天早上我会更完整地回答。

    e2e.ti.com/.../compile3.zip

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

    您好!

    帖子中的最后一个答案解释了我们想要实现的目标:

    请参阅随附的另一个情景,我们将根据下图构建该情景

    在这种情况下,调用libFile02的构造函数(由于pragma Retain)。

    e2e.ti.com/.../compile4.zip

    此致

    Przemek

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

    请考虑此解决方案。  使用类似于...的命令构建静态库

    ar6x -r name.lib libfile01.obj libfile02.obj 

    将name.lib添加到link命令中,就像任何其他文件一样。  链接程序自动确定它是一个库,并相应地处理它。

    要强制全局对象及其构造函数成为链接的一部分,请将链接程序选项--UNDEF_SYM应用于每个全局对象。  请在 C6000装配手册中阅读有关该选项的更多信息。  在这种情况下,将这些选项添加到链接...

    --UNDEF_SYM=libFile01 --UNDEF_SYM=libFile02 

    您的完整应用程序可能有两个以上的应用程序。  您可以在文本命令文件中随意写入它们,每行一个。  将该命令文件提供给链接程序,就像任何其他文件一样。   

    另一点... 批处理文件直接调用lnk6x。  这不是已记录的方法,即使它在许多情况下确实有效。  记录的方法是通过编译器shell调用链接器...

    cl6x -z <选项><文件> 

    谢谢,此致,

    -George

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

    您好,George!

    感谢您的回答和建议。 现在,它在没有pragma Retain的情况下工作。 有趣的是,必须使用增量链接。 附加的是用于生成程序的命令。

    /cfs/file/__key/communityserver-discussions-组件文件/81/8561.compile5.zip

    此致

    Przemek

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

    Przemyslaw_Baranski 说:
    有趣的是,必须使用增量链接。[/QUETE]

    我不明白为什么。  当我像这样构建库时...

    ar6x.exe -r libfile.lib libfile01.obj libfile02.obj 

    我根本不做增量链接,我得到的是相同的程序。

    谢谢,此致,

    -George

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

    您是否使用UNDEF_SYM选项(即)链接程序

    lnk6x.exe main.obj libfile.lib linker.cmd rts6600_elf.lib --ram_model-o prog5.out --UNDEF_sym=libFile01 --UNDEF_sym=libFile02

     


    此致

    Przemek

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

    Przemyslaw_Baranski 说:
    您是否使用UNDEF_SYM选项链接程序

    是的。  我会给你更多的细节。

    生成目标文件后,我使用此命令创建一个库...

    ar6x -r name.lib libfile01.obj libfile02.obj 

    然后我使用此命令链接...

    cl6x -z --UNDEF_sym=libFile01 --UNDEF_sym=libFile02 main.obj linker.cmd name.lib rts6600_elf.lib --ram_model -o prog_lib.out 

    我使用名称实用程序的方式有点不同...

    nm6x.exe -l -g prog_lib.out | dem6x -q --abi=eabi > prog_lib.txt 

    使用-g时,您只能获得全局符号。  我通过demangler dem6x运行names实用程序的输出,以将 像_ZZN9LibFile01C1Eves这样的名称转换为 LibFile01::LibFile01()::string。  然后,我检查prog_lib.txt以查找libfile的任何实例(不区分大小写)...

    C:\work\dir>find /i "libfile" prog_lib.txt
    
    ------- PROG_LIB.TXT
    [1677]|0x8.0007万b60| 13|GLOB|OBJT |隐藏|8. |LibFile01::LibFile01()::string
    [1679]|0x8.0007万b70| 13|glob |OBJT |Hidn |8. |LibFile02::LibFile02()::string
    [1678]|0x8.0006万de0| 0|glob |FUNC |Hidn |4. |__STI__13_libfile01_cpp_7.384万bb6
    [1681]|0x8.0006万e20| 0|glob |FUNC |Hidn |4. |__STI__13_libfile02_cpp_ea8d5a0c
    [1676]|0x8.0007万cd8| 1|glob |OBJT |Hidn |12 |libFile01
    [1680]|0xOB7cd9| 1|glob JT |Hidn |80.0012万 |libFile02 

    当我使用compile5方法执行相同操作时,我会看到相同的符号。  我认为这是指就这些对象而言,这些方案是相同的。

    谢谢,此致,

    -George

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

    您好,George!
    事实上,你建立这个计划的方式也对我有用。 感谢您的建议!

    仅供参考-我注意到GCC编译器/链接器的行为不同。 使用以下命令以类似方式生成时,不会调用全局构造函数。

    :: Clean
    del *。obj
    del libfile.lib
    del prog5out_gcc.exe
    
    ::编译
    gcc.exe -c libfile01.cpp -o3 -o libfile01.obj
    gcc.exe -c libfile02.cpp -o3 -o libfile02.obj
    
    ::archive
    ar CR libfile.lib file01.libfile01.libfile02.obj
    
    ::链接最终程序
    gcc.exe main.cpp libfile.lib -wl,--obj=libFile01,--libo -libo -02未定义prog5out_gcc.exe 

    此致

    Przemek

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

    George,

    是否有办法"取消定义"文件中的所有符号?

    此致
    Przemek

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

    很遗憾,不是  --UNDEF_SYM的作用一次只能应用于一个符号。  请记住,您可以在文本命令文件中列出所有选项,然后将该文件提供给链接器。  您也可以考虑编写一个脚本,该脚本将获取names实用程序的输出并将其更改为--UNDEF_SYM选项列表。

    谢谢,此致,

    -George