使用 gdb 和 u-boot efi payload 的困难

Difficulties with using gdb and u-boot efi payload

我花了好几天时间来解决这个问题,但没有结果。我想使用 gdb 在 qemu 上调试 u-boot。我正在使用 u-boot 的 64 位 efi 有效载荷(其中 u-boot 被放置在 efi 存根应用程序的有效载荷中)和带有 ovmf 固件的 x86-64 qemu。我有两个用于调试符号的 elf 文件:u-boot 和 u-boot-payload。似乎 u-boot 包含 u-boot 本身的符号,而 u-boot-payload 包含存根应用程序的符号。

我一直在遵循几个关于如何做到这一点的指南: https://www.haiku-os.org/blog/kallisti5/2021-01-17_debugging_riscv-64_bootloader_in_qemu/ https://wiki.osdev.org/Debugging_UEFI_applications_with_GDB

我的问题是 gdb 永远无法命中断点。我相信问题是我找不到将符号加载到的偏移量。所有这些指南都提到了重定位,我尝试使用他们建议的相同公式 ( - SYS_MONITOR_LEN),但没有成功。我试过 u-boot 输出的地址:

SYS_TEXT = 01110000
UBOOT    = 7e36f200
SIZE     = 0005cdcf

但其中 none 有效。我试过破坏存根和 u-boot 本身的功能,但没有任何效果。我已经这样做了很长时间,老实说,我很难准确地回忆起我尝试过的所有内容,但我 运行 没有想法。

是不是我做出了一些潜在的假设让我误会了,或者真的只是我使用了错误的偏移量?我读过 u-boot 重定位,但我不明白它重定位到什么地址以及什么时候。是存根重定位,还是重定位发生在存根 运行 之前?这些都是我没有找到任何澄清的东西。

任何反馈都有帮助,我很难提出更具体的问题,因为我不确定自己做错了什么。

想通了! add-symbol-file 所需的参数来自 common/board_f.c 在 setup_reloc 函数运行后,gd->relocaddr 的值将包含您需要的 add-symbol-file.

我遇到的另一个问题是您需要在 gdb 中使用 hbreak 而不是 break。这是一个“硬件辅助”断点,出于某种原因,我看到的所有在线指南都没有提到这一点。我希望其他人觉得这很有用