Skip to content
Advertisement

“add-symbol-file” can’t recognize .bss & .data symbols when using kgdb to debug kernel modules

I am trying to use gdb 8.3.1 for the kernel module on RPI-4 board.

When I use the command add-symbol-file to add .bss and .data sections, it doesn’t work.

The Kernel version is 5.4 and CONFIG_DEBUG_INFO is turned on. I list the simple code, dmesg and kgdb info below. If you have any idea, please give me some advice.

Module code:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

volatile int my_var_1=5;
volatile int my_var_2;

static int __init my_test_init(void)
{
        printk("&my_var_1 = %lxn", &my_var_1);
        printk("my_var_1 = %lxn", my_var_1);
        printk("&my_var_2 = %lxn", &my_var_2);
        printk("my_var_2 = %lxn", my_var_2);

        return 0;
}

static void __exit my_test_exit(void)
{
        printk("my_test_exitn");

}

module_init(my_test_init);
module_exit(my_test_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("This is a test module");

dmesg output:

pi@raspberrypi:~$ dmesg
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
[    0.000000] Linux version 5.4.83-v8+ (ken@ken-Inspiron-5458) (gcc version 7.5.0 (Linaro GCC 7.5-2019.12)) #3 SMP PREEMPT Wed Jan 20 05:57:0
0 CST 2021
[    0.000000] Machine model: Raspberry Pi 4 Model B Rev 1.4
...
[  923.192915] &my_var_1 = ffffffc008fa0000
[  923.192919] my_var_1 = 5
[  923.192923] &my_var_2 = ffffffc008fa03c0
[  923.192926] my_var_2 = 0
pi@raspberrypi:~$ sudo su
root@raspberrypi:/home/pi# cat /sys/module/my_test/sections/.bss
0xffffffc008fa03c0
root@raspberrypi:/home/pi# cat /sys/module/my_test/sections/.data
0xffffffc008fa0000
root@raspberrypi:/home/pi# [ 1095.449458] sysrq: DEBUG
Entering kdb (current=0xffffffc010ebf780, pid 0) on processor 0 due to Keyboard Entry
[0]kdb>

kgdb: bt, it recognize text:

(gdb) bt
#0  arch_kgdb_breakpoint () at ../arch/arm64/include/asm/kgdb.h:21
#1  kgdb_breakpoint () at ../kernel/debug/debug_core.c:1138
#2  0xffffffc0101c45e4 in sysrq_handle_dbg (key=<optimized out>) at ../kernel/debug/debug_core.c:901
#3  0xffffffc01069305c in __handle_sysrq (key=103, check_mask=true) at ../drivers/tty/sysrq.c:556
#4  0xffffffc010693184 in handle_sysrq (key=103) at ../drivers/tty/sysrq.c:588
#5  0xffffffc0106b9b64 in uart_handle_sysrq_char (port=<optimized out>, ch=<optimized out>) at ../include/linux/serial_core.h:469
#6  pl011_fifo_to_tty (uap=0xffffff81f4879080) at ../drivers/tty/serial/amba-pl011.c:355
#7  0xffffffc0106ba90c in pl011_rx_chars (uap=<optimized out>) at ../drivers/tty/serial/amba-pl011.c:1380
#8  pl011_int (irq=<optimized out>, dev_id=0xffffff81f4879080) at ../drivers/tty/serial/amba-pl011.c:1536
#9  0xffffffc0101513f0 in __handle_irq_event_percpu (desc=0xffffff81f5444400, flags=0xffffffc010003ed4) at ../kernel/irq/handle.c:149
#10 0xffffffc010151688 in handle_irq_event_percpu (desc=0xffffff81f5444400) at ../kernel/irq/handle.c:189
#11 0xffffffc01015172c in handle_irq_event (desc=0xffffff81f5444400) at ../kernel/irq/handle.c:206
#12 0xffffffc010156f98 in handle_fasteoi_irq (desc=0xffffff81f5444400) at ../kernel/irq/chip.c:725
#13 0xffffffc010150114 in generic_handle_irq_desc (desc=<optimized out>) at ../include/linux/irqdesc.h:156
#14 generic_handle_irq (irq=14) at ../kernel/irq/irqdesc.c:644
#15 0xffffffc01015096c in __handle_domain_irq (domain=0xffffff81f5c10800, hwirq=14, lookup=true, regs=0xffffffc010eb3d50)
    at ../kernel/irq/irqdesc.c:681
#16 0xffffffc010081af0 in handle_domain_irq (regs=<optimized out>, hwirq=<optimized out>, domain=<optimized out>)
    at ../include/linux/irqdesc.h:174
#17 gic_handle_irq (regs=0xffffffc010eb3d50) at ../drivers/irqchip/irq-gic.c:364
#18 0xffffffc010083cbc in el1_irq () at ../arch/arm64/kernel/entry.S:670
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

kgdb: print

(gdb) monitor lsmod
Module                  Size  modstruct     Used by
my_test                16384  0xffffffc008fa0040    0  (Live) 0xffffffc008f9e000 [ ]
(gdb) add-symbol-file ~/Study/Linux_Drv/My_Test/my_test.ko 0xffffffc008f9e000 -s .bss 0xffffffc008fa03c0 -s .data 0xffffffc008fa0000
add symbol table from file "/home/ken/Study/Linux_Drv/My_Test/my_test.ko" at
        .text_addr = 0xffffffc008f9e000
        .bss_addr = 0xffffffc008fa03c0
        .data_addr = 0xffffffc008fa0000
(y or n) y  <== gdb understand the sections above
Reading symbols from /home/ken/Study/Linux_Drv/My_Test/my_test.ko...
(gdb) p my_var_1
Cannot access memory at address 0x0 <== gdb still not recognize the sections
(gdb) p my_var_2
Cannot access memory at address 0x0
(gdb) x /2x 0xffffffc008fa0000
0xffffffc008fa0000 <my_var_1>:  0x00000005  0x00000000 <== my_var_1 exist but gdb can't find out
(gdb) x /2x 0xffffffc008fa03c0
0xffffffc008fa03c0 <my_var_2>:  0x00000000  0x00000000 <== my_var_2 exist but gdb can't find out
(gdb) p jiffies      <==inline symbol could be recognized
$3 = 4295166156

Advertisement

Answer

I use gdb10.1 and the problem is fixed.

(gdb) add-symbol-file /home/ken/Study/Linux_Drv/My_Test/my_test.ko 0xffffffc008f21000 -s
.bss 0xffffffc008f233c0 -s .data 0xffffffc008f23000
add symbol table from file "/home/ken/Study/Linux_Drv/My_Test/my_test.ko" at
.text_addr = 0xffffffc008f21000
.bss_addr = 0xffffffc008f233c0
(y or n) y
Reading symbols from /home/ken/Study/Linux_Drv/My_Test/my_test.ko...

I print variables and it works fine now.

(gdb) p &my_var_1
$1 = (volatile int *) 0xffffffc008f23000 <my_var_1>
(gdb) p &my_var_2
$2 = (volatile int *) 0xffffffc008f233c0 <my_var_2>
(gdb) p my_var_1
$3 = 5
(gdb) p my_var_2
$4 = 0

Hope this information helps you.

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement