有没有办法在映射文件中找到 const 变量的地址?
Is there a way to find the address of a const variable in the map file?
我正在使用 Segger 嵌入式工作室为 Nordic NRF52840 微控制器编写嵌入式 C 代码。
编译我的代码后,我通过 gcc 获得了一个 .map 文件和一个 .hex 文件。
我想写一个脚本,在.map文件中寻找常量变量的地址。
然后,脚本应在 .hex 文件中搜索该地址,并通过从该地址的 .hex 文件中读取值,return 常量变量的值。
我的假设是,一个常量变量应该放在微控制器的Flash中。因此,它应该存在于 .hex 文件中。为了找到这个变量的地址,我在 .map 文件中寻找变量的名称。
但是现在,我的 compiler/linker 有以下行为:
在我的代码中,我在主文件中定义了以下变量并保证链接器不会优化我的常量:
uint32_t const test123= 0x12345;
int main()
{
int retVal = foo_in_other_file();
if(test123 == retval)
{
static volatile int i = 0;
i++;
retval = true;
}
}
.map 文件中常量周围的部分如下所示:
.bss.is_asleeparr
0x0000000000000000 0x400 temp/release/main.o
.rodata.test123
0x0000000000000000 0x4 temp/release/main.o
.text 0x0000000000000000 0x0 temp/release/ble_advdata.o
.data 0x0000000000000000 0x0 temp/release/ble_advdata.o
.bss 0x0000000000000000 0x0 temp/release/ble_advdata.o
.text.sd_ble_gap_addr_get
常量变量test123存在于.map文件中,但为什么它的地址为零?
它是否被链接器优化掉了?
提前感谢您的帮助:)
编辑:
这里是反汇编的截图。这是否意味着编译器确实将值解释为立即数,甚至没有存储到闪存中?
如果这是真的,我如何避免这种情况?
Disassembly of my code
多亏了我post的评论帮助,才解决了问题。
通过以下声明,变量的地址显示在我的映射文件中:
static uint32_t const test123 __attribute__((used)) = 0x4711;
我必须按如下方式访问变量,以防止编译器和链接器优化或将变量用作立即数:
if(*((volatile uint32_t*) &test123) == 4711)
{
static volatile uint32_t optimization_prevention = 0;
optimization_prevention+= test123;
}
使用此代码,“test123”的地址显示在 .map 文件中:
.rodata.test123
0x0000000000052dcc 0x4 temp/release/test_file.o
感谢大家的大力帮助:)
我正在使用 Segger 嵌入式工作室为 Nordic NRF52840 微控制器编写嵌入式 C 代码。 编译我的代码后,我通过 gcc 获得了一个 .map 文件和一个 .hex 文件。
我想写一个脚本,在.map文件中寻找常量变量的地址。 然后,脚本应在 .hex 文件中搜索该地址,并通过从该地址的 .hex 文件中读取值,return 常量变量的值。
我的假设是,一个常量变量应该放在微控制器的Flash中。因此,它应该存在于 .hex 文件中。为了找到这个变量的地址,我在 .map 文件中寻找变量的名称。
但是现在,我的 compiler/linker 有以下行为:
在我的代码中,我在主文件中定义了以下变量并保证链接器不会优化我的常量:
uint32_t const test123= 0x12345;
int main()
{
int retVal = foo_in_other_file();
if(test123 == retval)
{
static volatile int i = 0;
i++;
retval = true;
}
}
.map 文件中常量周围的部分如下所示:
.bss.is_asleeparr
0x0000000000000000 0x400 temp/release/main.o
.rodata.test123
0x0000000000000000 0x4 temp/release/main.o
.text 0x0000000000000000 0x0 temp/release/ble_advdata.o
.data 0x0000000000000000 0x0 temp/release/ble_advdata.o
.bss 0x0000000000000000 0x0 temp/release/ble_advdata.o
.text.sd_ble_gap_addr_get
常量变量test123存在于.map文件中,但为什么它的地址为零? 它是否被链接器优化掉了?
提前感谢您的帮助:)
编辑:
这里是反汇编的截图。这是否意味着编译器确实将值解释为立即数,甚至没有存储到闪存中? 如果这是真的,我如何避免这种情况?
Disassembly of my code
多亏了我post的评论帮助,才解决了问题。
通过以下声明,变量的地址显示在我的映射文件中:
static uint32_t const test123 __attribute__((used)) = 0x4711;
我必须按如下方式访问变量,以防止编译器和链接器优化或将变量用作立即数:
if(*((volatile uint32_t*) &test123) == 4711)
{
static volatile uint32_t optimization_prevention = 0;
optimization_prevention+= test123;
}
使用此代码,“test123”的地址显示在 .map 文件中:
.rodata.test123
0x0000000000052dcc 0x4 temp/release/test_file.o
感谢大家的大力帮助:)