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.

[参考译文] Compiler/RM48L952:编译器删除了未使用的全局版本字符串,如何保留?

Guru**** 2522770 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/630987/compiler-rm48l952-unused-global-version-string-removed-by-compiler-how-to-keep-it

部件号:RM48L952

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

您好,

我想使用字符串(Linux命令)从可执行文件中获取版本和git信息。
使用GCC时,将以下行添加到源代码时,它可以正常工作。

主要c:

#include <stdint.h>

const char* version_string ="###版本信息-版本0.1 内置(2017年10月09日 11:19:00)_##";

int main (void){

/*

 *此处提供一些代码。

 */

}

然后我可以使用:

$字符串my_executable.out | grep "###"

获取版本字符串信息。

但是,当我使用TI编译器编译同一源文件时,目标文件中的字符串将被删除。  
当我在某些伪函数中使用变量时,编译器不会删除它,我可以使用字符串获取它,但是我们不需要死代码。

我尝试添加volatile,static,__attribute_((Used )),但这些都没有区别。

我正在使用以下编译标志(来自CCS内部):

-mv7R4 --code_state=32 --float_support=VFPv3D16 -me -off --opt_for _speed=1 --include_path="${CG_tool_root}/include"--include_path="${workspace_loc://${ProjName}/include}"-g --include_path="-symp_tool_root}/include_3=-probiag_probe_3=-type_probnex_abw_-f---refus_jiag_jiag=99_support_ex_exb_ex_support=abw_ex-f_ex-ref-ref-ref_display_support_support_ex_display_ex_support=en_  

这些是链接选项,但是由于该字符串也不在目标文件中,我不认为链接程序会引起任何问题。

-m"${ProjName}.map"--heap_size=0x800 --stack_size=0x800 -i"${CG_TOOL_ROOT}/lib"-i${CG_TOOL_ROOT}/include"--reread_libs-diag_wrap=off --display_error_number --warn_sections --xml_proj_info_-xml_model_export.xml_line."-link_off_proj_infection_us_link_off_linuel_link_ex_ex_use.  

我正在使用版本v 16.9 .0.LTS。

现在的问题是,我是否可以添加编译/链接标志以防止编译器/链接器删除此变量?

提前感谢:)
Karel

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

    K DE COSTER 说:
    我已尝试添加volatile,static,__attribute__((已用)),但所有这些都没有任何区别。

    __attribute___(((Used ))应该已经完成了。  因为没有,所以我在 SDOWP系统中提交了CodeGen-3793。  欢迎您使用我签名中下面的SDOWP链接进行关注。

    K DE COSTER 说:
    我是否可以添加编译/链接标志以防止编译器/链接器删除此变量?[/QUOT]

    使用#pragma Retain。  请在 ARM编译器手册中阅读有关该工具的更多信息

    谢谢,此致,

    -George

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

    感谢您的快速响应。
    结果是添加__attribute___((Used ))是有效的,我曾尝试将其与static (static const char * version_string __attribute___((Used ))="###...##";). 静态和__attribute___(((Used ))的组合似乎会使其消失。 我不太理解这两种属性如何相互矛盾。 但是我的问题已解决。
    解决方案:

    const char* version __attribute___(((used ))="#_# v 0.1 ##";

    结果是甚至不需要编译标志-Ooff。
    需要链接标志--unused_section_elimination=off,否则链接程序将删除它。

    此致,非常感谢,


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

    K de Coster 说:
    需要链接标志--unused_section_elimination=off

    如果一切正常,则不需要执行此步骤。  此外,使用此选项可能会导致保留其他应删除的部分,从而浪费内存。   

    请尝试使用我前面介绍的#pragma Retain。  只有这样才能解决问题。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正确,__attribute___((((used ))和 #pragma Retain的组合也会修复此等。 这就是它现在的写法:

    #pragma Retain (版本)
    const char const * version __attribute__((used))="###_ version __#";

    再次感谢:)