如何在.bss中查看静态变量的内存位置?

时间:2014-04-16 21:14:07

标签: c gcc ld

假设我在gps_anetenova_m10478.c中声明了一个静态变量,如下所示:

static app_timer_id_t m_gps_response_timeout_timer_id;

我的代码中有一些缓冲区溢出错误,在某些时候,在内存中m_gps_response_timeout_timer_id之前写入变量就会覆盖它。

我可以使用Eclipse的GDB客户端中的“表达式”视图找出内存中m_gps_response_timeout_timer_id的位置。只需输入&m_gps_response_timeout_timer_id即可。但是如何判断哪个变量在内存中紧跟在它之前?

有没有办法将此信息存入ld生成的.map文件中?目前我只看到源文件:

 .bss           0x000000002000011c        0x0 _build/debug_leds.o
 .bss           0x000000002000011c     0x11f8 _build/gps_antenova_m10478.o
 .bss           0x0000000020001314     0x161c _build/gsm_ublox_sara.o

1 个答案:

答案 0 :(得分:2)

老实说,我对Eclipse不够了解,无法在Eclipse中轻松实现这一目标。您可能正在寻找的工具是objdumpnmobjdump的一个示例就是运行objdump -x <myELF>。然后,这将返回文件中的所有符号,它们所在的部分以及它们的地址。然后,您必须根据地址手动搜索您感兴趣的变量。

objdump -x <ELFfile>将按以下方式提供输出:

000120d8 g     F .text  0000033c bit_string_copy
00015ea4 g     O .bss   00000004 overflow_bit
00015e24 g       .bss   00000000 __bss_start
00011ce4 g     F .text  0000003c main
00014b6c g     F .text  0000008c integer_and

第一列是地址,第四列是该部分,第五列是该字段的长度。

nm <ELFfile>提供以下内容:

00015ea8 B __bss_end
00015e24 B __bss_start
0000c000 T _start
00015e20 D zero_constant
00015e24 b zero_constant_itself

第一列是地址,第二列是该部分。 D / d是数据,B / b是BSS,T / t是文本。其余部分可以在联机帮助页中找到。 nm也接受-n标记,按行号对数字地址进行排序。