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并保留链接。