TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS570LC4357: __attribute__((used)) 无法生效问题

Part Number:TMS570LC4357

请教一些关于链接器的问题。

例如我在代码里用__attribute__方法声明了一个变量,并给它归类到名叫"test"的section里:但是目前这个变量并没有在函数内调用过。

static __attribute__((used, section("test"))) int attribute_test_var = 0;

然后在 cmd文件的 SECTIONS字段内添加对应section的描述。并在链接脚本里添加两个变量观察该section的首位地址,用来确认该section内是否存在内容

test : {*(test)
}LOAD_START(_test_start_address),LOAD_END(_test_end_address)
> FLASH0

编译器会给出 warning #10068-D: no matching section 这类告警

编译后输出的map文件内SECTION ALLOCATION MAP这里的section描述里,会发现,test的section内并没有内容,长度为0。

但是再往下查找变量是否被编译,会发现该变量确实被编译了,也确实归纳为 ”test“的section。说明链接器将该变量视为无效变量丢弃了。

map文件内容对应输出的两行如下

SECTION ALLOCATION MAPoutputattributes/
sectionpageoriginlengthinput sections
--------  ----  ----------  --------------------------
test00000002000000000UNINITIALIZED


GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name 

addressname
-----------
00000020  _test_end_address
00000020  _test_start_address

GLOBAL SYMBOLS: SORTED BY Symbol Address 

addressname
-----------
00000020  _test_end_address
00000020  _test_start_address  


================================================================================

main.obj

Run/Load
ValueBindingName (Section)
--------  --------  ---------------
00000000  localattribute_test_var (test)

上述的这种情况如果再将该变量作为左值或者右值调用一下,编写代码再次编译。map文件内就能看到 "test" section内出现了内容

 outputattributes/
sectionpageoriginlengthinput sections
--------  ----  ----------  --------------------------
test00000002000000004UNINITIALIZED0000002000000004main.obj (test)

GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name 

addressname
-----------
00000024  _test_end_address
00000020  _test_start_address 

GLOBAL SYMBOLS: SORTED BY Symbol Address 

addressname
-----------
00000020  _test_start_address
00000024  _test_end_address 

由上述情况基本确认  __attribute__((used)) 的属性尚未生效。

另外通过代码修改和编译测试下来。发现 被 const修饰过的变量,即使在代码内作为右值使用,依然会被连接器丢弃,无法编入section内。

 

我代码调试用的编译器版本为: TI v20.2.7.LTS

查阅编译器手册资料:

ARM Optimizing C/C++ Compiler v20.2.0.LTS:  https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_OtherMCU_spnu151w.pdf

内容 5.17.4 Variable Attributes 章节确认,编译器应该是能支持 __attribute__ 中 used属性的。

关于上面的问题是否可以请教帮忙解决一下。

问题之外

在查阅另一个手册资料发现了Linker工具的详细说明,在里面发现了一个较为粗暴的解决办法

ARM Assembly Language Tools v20.2.0.LTS:https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_OtherMCU_spnu118z.pdf

内容 8.4.10 Do Not Remove Unused Sections内,在编译时将编译选项调整为 –unused_section_elimination=off

可以强行将所有未使用的变量全部保留并链接。但是我这里自己开发的项目存在机器生成的代码,有大量未使用的变量。所以不是很想用这种方法来解决我上述的问题。

希望能在论坛里有人能给出更合理的解决方案吧。

Links:

感谢您对TI产品的关注!为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上(https://e2e.ti.com/p/addpost).

,

Junjie Shi:

好的,我现在已将问题重新发布到E2E英文技术论坛上了。

 这是对应的链接TMS570LC4357: __attribute__((used)) does not take effect in ti-cgt-arm_20.2.7.LTS

问题解决后重新编辑:

Junjie Shi 说:ARM Optimizing C/C++ Compiler v20.2.0.LTS:  https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_OtherMCU_spnu151w.pdf

该文档中  Section 5.11.27 The RETAIN Pragma 这个参数可以将变量标记为used并保留链接。

赞(0)
未经允许不得转载:TI中文支持网 » TMS570LC4357: __attribute__((used)) 无法生效问题
分享到: 更多 (0)