在过去的一段时间里,我一直在慢慢地致力于开发一个爱好者内核,并且一直以来我一直在使用 GDB 和 QEMU 来研究内存位置和寄存器等等。然而,我最近擦除了我的 Mac 并安装了 macOS Big Sur 的新副本,虽然 Mojave 上的自制软件 GDB 能够很好地加载我的内核二进制文件,但在 Big Sur 上,它只是抛出此错误消息:Reading symbols from ~/Kernel/bin/kernel... I'm sorry, Dave, I can't do that. Symbol format `elf32-i386' unknown
。
我不知道是什么原因造成的,我使用的是自制程序中的 GDB 的库存版本,GDB 10.1。我还尝试使用自制软件中的 i386-elf-gdb,但这也不起作用。我什至尝试自己编译 GDB,并设置各种配置选项,例如 --enable-targets=all,并将目标设置为 i686-elf,但似乎没有任何效果,我的配置选项都不会在 macOS 上启用任何 GDB Big Sur,可以从源代码编译,也可以从自制软件下载,以读取 elf32-i386 内核二进制文件。
答案1
弄清楚问题是什么,结果发现 clang 确实不喜欢当您尝试使用 strncmp 而不首先包含 string.h 时。同时,gcc 非常乐意编译 elf-bfd.h,而不包含 string.h。因此,即使 GDB 可以在 macOS 上编译,它也只是拒绝加载任何 ELF 文件,因为 ELF 代码未正确编译。修复方法只是添加#include <string.h>
到 elf-bfd.h 的顶部,GDB 将正确加载 ELF 二进制文件。
答案2
对于 Macos,如果您使用brew,您可以安装并使用 i386-elf-gdb -https://formulae.brew.sh/formula/i386-elf-gdb。
brew install i386-elf-gdb