在构建基于 gcc 的裸机 mcu 项目时,您需要在启动期间注意 .data 和 .bss 部分的初始化。
.bss 部分非常简单,因为我只是将整个部分填充为 0。但是 .data 部分中的变量需要将其初始化数据保存在 rom/flash 中并在启动时复制。
我如何知道在哪里可以找到具有初始化值的数据?
让我们举个例子。
假设我在 main.c 中创建了两个全局变量
unsigned int my_global_variable_one = 1;
unsigned int my_global_variable_two = 2;
然后我可以在目标文件上使用 objdump 来查看它们将在哪个部分,但我在 objdump 输出中找不到任何应该放置 init 数据的地方。
$ arm-none-eabi-objdump --syms main.o | grep my_global_variable
00000000 g O .data 00000004 my_global_variable_one
00000004 g O .data 00000004 my_global_variable_two
然后我可以查看整个系统生成的 elf,在本例中为 main.elf。
$ arm-none-eabi-nm -n main.elf | grep my_global_variable
20000000 D my_global_variable_one
20000004 D my_global_variable_two
我在哪里可以找到它们的位置以便我可以复制数据?我需要在链接器脚本中添加什么?
它应该在 .text 或 .rodata 之类的文件中,但我怎么知道呢?
如何检查 my_global_variable_one 的初始化数据在哪里?
我可以使用 readelf 或 objdump 等任何 binutils 命令找到这些数据的位置吗?
/谢谢
这是在 stm32 (Cortex M3) mcu 上,使用的是 CodeBench 版本的 gcc。