gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:35 25 4
gpt4 key购买 nike

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

static app_timer_id_t m_gps_response_timeout_timer_id;

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

我可以使用 Eclipse 的 GDB 客户端中的“表达式” View 找出 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

最佳答案

老实说,我对 Eclipse 的了解还不够,无法在 Eclipse 中提供一种简单的方法来获得它。您可能正在寻找的工具是 objdumpnm . objdump 的示例就是简单地运行 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标记以按数字地址对行进行排序。

关于c - 如何查看 .bss 中静态变量的内存位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23120273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com