gpt4 book ai didi

c - 使用 GDB 时缺少 ELF 符号 "var"?

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

我能够使用 ARM GCC 成功编译我的程序。我也能够成功地编程和运行我的程序。

当我试图检查一个变量的内容时,问题就来了。 GDB 提示有问题的变量缺少符号。

当我从 objdump 检查 .lst 文件时,我可以看到变量没有符号。

这是我的 main.c 文件:

#include "project.h"

const char *my_string = "tired!";

int main(void) {
while(1)
{
// do nothing;
}

return 0;
}

当我检查 my_string 的内容或至少打印指针的地址时,出现以下错误:

Missing ELF symbol "my_string".

我尝试通过执行命令打印变量:info variables

未显示变量 my_string

我知道 main.c 文件正在编译,因为我可以在 while 循环中运行一些程序,如果我故意添加语法错误,那么编译器会报错。

如果我检查汇编文件,我可以看到变量 my_string

我知道这个问题有点模糊,所以如果您需要更多信息,请告诉我要检查的内容。我正试图找到我应该寻找的方向。谢谢。

最佳答案

好的,我发现了这个问题。我在这里写下答案,以防将来有人需要这方面的帮助。

我有两个固件平台。每个都使用不同版本的 GDB。

平台 A 使用:GNU gdb(ARM 嵌入式处理器的 GNU 工具)7.4.1.20130913-cvs

平台 B 使用:GNU gdb(GNU Tools for Arm Embedded Processors 8-2019-q3-update)8.3.0.20190703-git

我的第一个假设是编译器正在优化变量。所以我检查了我的优化设置,它们被设置为 -O2。我将其更改为 -O0 并重新编译。问题仍然存在。

当我执行 load 命令将我的 elf 文件闪存到我的 MCU 时,当我比较两个 GDB 版本的输出时,我注意到了一些事情。 v7.4.1 会说:

“/build/debug.elf”已经改变;重新阅读符号。

v8.3.0 会说:

“/build/myProject_v53.elf”已经消失;保留其符号。

我的 elf 文件在每次构建后都会重命名,名称中嵌入了构建号。每次编译时这个数字都会递增。我有一个指向新生成的 elf 文件的符号链接(symbolic link),它被命名为 debug.elf。因此 debug.elf 每次都指向新的 elf 文件。

在以前的 GDB 版本中,可以使用符号链接(symbolic link)。 GDB 不关心文件名是否更改,因为它只是一个符号链接(symbolic link)。在新版本的 GDB 中不是这样。 GDB 读取符号链接(symbolic link)指向的文件名以确定符号表是否已更改。

我通过修改启动时传递给 GDB 的命令文件来解决这个问题。

我在 Makefile 中使用以下命令启动 GDB:

$(GDB) build/debug.elf --command=cfg/launch.gdb

在这个文件中,我有一个 Hook 用于执行加载命令。

define hook-load
mon reset halt
end

这允许我在对 MCU 编程后重置和停止设备。

我修改了它以在每次刷新 MCU 时强制更新符号表。

define hook-load
file build/debug.elf
mon reset halt
end

就是这样。

关于c - 使用 GDB 时缺少 ELF 符号 "var"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58194568/

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