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.

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

Part Number: TMS570LC4357

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

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

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

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

Fullscreen
1
2
3
4
5
test : {
*(test)
} LOAD_START(_test_start_address),
LOAD_END(_test_end_address)
> FLASH0
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SECTION ALLOCATION MAP
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
test 0 00000020 00000000 UNINITIALIZED
GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name
address name
------- ----
00000020 _test_end_address
00000020 _test_start_address
GLOBAL SYMBOLS: SORTED BY Symbol Address
address name
------- ----
00000020 _test_end_address
00000020 _test_start_address
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
test 0 00000020 00000004 UNINITIALIZED
00000020 00000004 main.obj (test)
GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name
address name
------- ----
00000024 _test_end_address
00000020 _test_start_address
GLOBAL SYMBOLS: SORTED BY Symbol Address
address name
------- ----
00000020 _test_start_address
00000024 _test_end_address
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

 

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

查阅编译器手册资料:

ARM Optimizing C/C++ Compiler v20.2.0.LTS:  https://www.ti.com/lit/ug/spnu151w/spnu151w.pdf?ts=1717108109945

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

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

问题之外

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

ARM Assembly Language Tools v20.2.0.LTS:https://www.ti.com/lit/ug/spnu118z/spnu118z.pdf?ts=1717084542730

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

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

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