硬汉嵌入式论坛

 找回密码
 立即注册
查看: 738|回复: 5
收起左侧

[ThreadX全家桶] threadx module app全局变量内容改写

[复制链接]

12

主题

16

回帖

52

积分

初级会员

积分
52
发表于 2024-7-24 12:30:56 | 显示全部楼层 |阅读模式
在调试threadx module的时候在APP定义的全局变量初始化为某个值(对应分配到了.data段),运行起来之后发现这个全局变量的值不是初始化的值。可能是0x0, 或者0xefefefef(栈填充值)。代码的逻辑里面没有修改这些全局变量。

请问版主在调试的过程遇到过吗?可能的原因是啥?谢谢。
回复

使用道具 举报

19

主题

335

回帖

392

积分

高级会员

积分
392
发表于 2024-7-25 09:27:28 | 显示全部楼层
可以通过map文件知道这个变量的地址,然后对这个地址下一个内存写断点,就知道什么时候对这个变量就行写操作了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-7-25 11:59:51 | 显示全部楼层
这有必要跟踪下代码,看看 module初始化这个全局变量值没,估计没有。
回复

使用道具 举报

12

主题

16

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2024-7-25 15:18:59 | 显示全部楼层
不是内存被改写,应该和变量初始化有关gcc_setup.s这个函数有关,对应arm编译的_txm_module_init函数。app定义的全局变量首先会按照app的链接脚本app.ld链接到指定位置。在执行gcc_setup的时候会将变量挪到module manager给app分配的地址,做到与app地址无关。这部分已经加trace看过,确实将app.bin里面的变量挪到了对应的位置。问题是变量使用的时候还是用的app.ld脚本指定的地址没有使用挪动之后的新地址。所以导致看到的变量不对,请问这种应该如何让变量使用挪动之后的地址呢?

这部分逻辑我对应版主家的板子看过,因为版主家是用的arm编译不是gcc,执行了_txm_module_init里面的__scatterload就把app.bin里面的全局变量挪到了module manager指定的位置。后面使用的值也是正确的。不确定为什么后续app的全局变量位置会自动使用这个地址。
我这边是用risc v gcc的编译,参考threadx官网arm的gcc实现。不过这个应该和处理器类型没有关系,只和编译链接有关。

能否请版主帮忙指导下app是怎么能使用挪动之后的地址的?gcc_setup.s前面有一段Copy GOT table的逻辑,感觉和这个可能有联系。这部分我也没有太理解。
谢谢。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-7-26 08:55:24 | 显示全部楼层
tdzhang 发表于 2024-7-25 15:18
不是内存被改写,应该和变量初始化有关gcc_setup.s这个函数有关,对应arm编译的_txm_module_init函数。app ...

说这个就想起来,之前看树莓派Pico单片机gcc的.s启动文件里面有个全局变量复制到对应位置的处理,你参考移植到这个里面,你看看是不是合适。
回复

使用道具 举报

0

主题

16

回帖

16

积分

新手上路

积分
16
发表于 2024-7-27 09:41:18 | 显示全部楼层
这一般要才程序里赋值一下,有时候DATA段没初始化
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-25 18:32 , Processed in 0.294382 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表