GDB 符号适用于 "break" 和 "print",但 "list" 因 "No debugging symbols found" 而失败

GDB symbols work for "break" and "print", but "list" fails with "No debugging symbols found"

有大量关于 GDB 和“未找到调试符号”警告的问题和答案,但所有这些都假设调试符号不是 .elf 文件的一部分。

我正在处理以下问题:

我迷路了...

如果重要的话,我正在使用 RISC-V 工具链。

这是我的 Makefile 的摘录:


TARGET          = $(TOOLS_PREFIX)/riscv32-unknown-elf
AS              = $(TARGET)-as
ASFLAGS         = -march=$(MARCH) -mabi=ilp32
LD              = $(TARGET)-gcc
LDFLAGS         = -march=$(MARCH) -g -mabi=ilp32 -Wl,-Tsections.lds,-Map,progmem.map -ffreestanding -nostartfiles -Wl,--no-relax
CC              = $(TARGET)-gcc
CFLAGS          = -march=$(MARCH) -g -ggdb -mno-div -mabi=ilp32 -Wall -Wextra -pedantic -DCPU_FREQ=$(CPU_FREQ_MHZ)000000 $(CC_OPT)
...
progmem.elf: $(OBJ_FILES) top_defines.h sections.lds Makefile 
    $(LD) $(LDFLAGS) -o $@ $(OBJ_FILES) -lm 

这是我的 GDB 会话日志:

/opt/riscv32im/bin//riscv32-unknown-elf-gdb progmem.elf \
    -ex "target remote localhost:3333"
...
Remote debugging using localhost:3333
0x0000002e in rdcycle64 ()
(gdb) 
(gdb) 
(gdb) monitor soft_reset_halt
requesting target halt and executing a soft reset
(gdb) file progmem.elf
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from progmem.elf...
(No debugging symbols found in progmem.elf)
(gdb) br main
Breakpoint 1 at 0x5d6
(gdb) load
Loading section .memory, size 0x5790 lma 0x0
Start address 0x0, load size 22416
Transfer rate: 23 KB/sec, 11208 bytes/write.
(gdb) c
Continuing.

Program stopped.
0x000005d6 in main ()
(gdb) p/x global_cntr
 = 0x0
(gdb) l
No symbol table is loaded.  Use the "file" command.
(gdb) 

I have a .elf file with debugging symbols. I can verify this by doing objdump, and seeing a disassembly with the subroutine labels being present.

调试符号与符号不同。对于拆卸,您只需要后者。对于源列表,您需要前者。

I can still do things like break main or p/x global_cntr!

这些也只需要符号 table。

您可以确认您没有使用objdump -g progmem.elfreadelf -wi progmem.elf的调试符号。

您的命令行看起来应该包含调试符号,但无法说明您对 sections.lds 链接描述文件中的 .debug_* 部分做了什么。可能你丢弃了它们,这可以解释为什么它们不存在。

更新:

Do you by any chance has an example sections.lds file that has them included?

ld --verbose 应该打印默认链接描述文件。这是一个 example.

我原来的链接描述文件如下:

SECTIONS {
    .memory : {
        . = 0x00000;
        start*(.text);
        *(.text);
        *(*);
        end = .;
    }
}

我怀疑我的问题是由 catchall *(*); 引起的,它将所有部分都移到了 .text 部分。

我将其替换为以下脚本:


MEMORY
{
    ram (ax)  : ORIGIN = 0x00000000, LENGTH = 16K
}

SECTIONS {
}

在此之后,包含 .debug_* 个符号。

这个脚本应该通过更精确地放置各个部分来改进,但它足以解锁我。