gdb-multiarch (MINGW64) 无法从可执行文件中确定架构?

gdb-multiarch (MINGW64) cannot determine architecture from executable?

我在看过:

If I compile a C program with any arm compiler (e.g. arm-none-eabi-gcc) and afterwards call gdb-multiarch with the binary as second param(e)ter, it will correctly determine the machine type and I can debug my remote application.

我在 Windows 10 上使用 MINGW64 (MSYS2) 上的 mingw-w64-x86_64-gdb-multiarch 12.1-1;不幸的是,它似乎无法确定架构。我在同一系统上为 Pico/RP2040 和 gcc 构建了一个可执行文件,系统将其视为:

$ file myexecutable.elf
myexecutable.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, with debug_info, not stripped

但是,如果我尝试在 gdb-multiarch 中 运行 这个,我得到:

$ gdb-multiarch myexecutable.elf
GNU gdb (GDB) 12.1
...

warning: A handler for the OS ABI "Windows" is not built into this configuration
of GDB.  Attempting to continue with the default armv6s-m settings.

Reading symbols from myexecutable.elf...
(gdb)

好吧,正如警告所说,gdb-multiarch 似乎将此 .elf 视为 'OS ABI "Windows"' - 类似于 中指出的内容:

If however I call gdb-multiarch on its own, it will assume my machine type (x86_64) and tries to debug the remote target with the wrong architecture..

...除了,我在这里调用 gdb-multiarch 并将二进制文件作为第二个参数 - 但我仍然有这个问题!

链接的问题已经解释了 GDB 中的 set architecture arch 应该有效;但是,我不确定要输入什么:file 说这个可执行文件是“ARM,EABI5”,我试图从中推导出一个体系结构标签,但这并不完全有效:

(gdb) set architecture armeabi5
Undefined item: "armeabi5".

...我对 ARM 不是很了解,所以我确切地知道要在此处手动输入什么。

因此,我希望 gdb-multiarch 能够自动找到架构。

如何说服gdb-multiarch正确检测编译文件的(ARM)架构?

您可能正在尝试使用仅适用于 Intel 架构的多架构 GDB。 您可以通过启动 GDB 并输入以下命令来检查: set architecture。如果是这种情况,支持的体系结构列表将如下所示:

(gdb) set architecture
Requires an argument. Valid arguments are i386, i386:x86-64, i386:x64-32, i8086, i386:intel, i386:x86-64:intel, i386:x64-32:intel, auto.
(gdb)

为了调试 cortex-m0 目标,我建议使用随 Arm arm-none-eabi toolchainarm-none-eabi-gdb:

提供的 GDB
(gdb) set architecture
Requires an argument. Valid arguments are arm, armv2, armv2a, armv3, armv3m, armv4, armv4t, armv5, armv5t, armv5te, xscale, ep9312, iwmmxt, iwmmxt2, armv5tej, armv6, armv6kz, armv6t2, armv6k, armv7, armv6-m, armv6s-m, armv7e-m, armv8-a, armv8-r, armv8-m.base, armv8-m.main, armv8.1-m.main, arm_any, auto.
(gdb) 

(gdb) set architecture armv6-m
The target architecture is set to "armv6-m".
(gdb)

Cortex-M0/Cortex-M0+ 的架构是 armv6-m,但我总是能够使用 GDB 调试 Cortex-M0 程序,而不必使用 set architecture