c - 内核模块没有找到调试符号

标签 c linux module gdb kernel

在我加载 linux 内核模块之后

user@c4:$ insmod mmaptest.ko

我可以验证它是否已加载

user@c4:$ cat /proc/modules 
mmaptest 12727 0 - Live 0x0000000000000000 (OF)

但所有段都以 0x00 地址列出。

user@c4$:$ systool -vm mmaptest
  Module = "mmaptest"

  Attributes:
    coresize            = "12727"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "0"
    srcversion          = "EABEF6F90BEAAD0D15B576A"
    taint               = "OF"
    uevent              = <store method only>

  Parameters:
    count               = "0"

  Sections:
    .bss                = "0x0000000000000000"
    .data               = "0x0000000000000000"
    .exit.text          = "0x0000000000000000"
    .gnu.linkonce.this_module= "0x0000000000000000"
    .init.text          = "0x0000000000000000"
    .note.gnu.build-id  = "0x0000000000000000"
    .rodata             = "0x0000000000000000"
    .rodata.str1.1      = "0x0000000000000000"
    .rodata.str1.8      = "0x0000000000000000"
    .smp_locks          = "0x0000000000000000"
    .strtab             = "0x0000000000000000"
    .symtab             = "0x0000000000000000"
    .text               = "0x0000000000000000"
    __mcount_loc        = "0x0000000000000000"
    __param             = "0x0000000000000000"

因此,当我尝试从模块文本段中的错误(?)地址加载符号时,我得到:

(gdb) add-symbol-file /home/mmaptest/mmaptest.ko 0x00
add symbol table from file "/home/mmaptest/mmaptest.ko" at
    .text_addr = 0x0
(y or n) y
Reading symbols from /home/mmaptest/mmaptest.ko...(**no debugging symbols found**)...done.

这是关于模块本身还是加载到内核代码中的情况?为什么所有地址都是 0x000000000000?

最佳答案

我的标志不正确。调试符号表是用这个 makefile 构建的:

obj-m += mmaptest.o
MY_CFLAGS += -g -DDEBUG
ccflags-y += ${MY_CFLAGS}
CC += ${MY_CFLAGS}


all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

debug:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
        EXTRA_CFLAGS="$(MY_CFLAGS)"
clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

现在可以通过以下方式验证:

peter@c4:$ readelf -S mmaptest.ko | grep debug

  [24] .debug_info       PROGBITS         0000000000000000  00000d40
  [25] .rela.debug_info  RELA             0000000000000000  00018260
  [26] .debug_abbrev     PROGBITS         0000000000000000  0000d577
  [27] .debug_loc        PROGBITS         0000000000000000  0000dd54
  [28] .rela.debug_loc   RELA             0000000000000000  00029510
  [29] .debug_aranges    PROGBITS         0000000000000000  0000e5d5
  [30] .rela.debug_arang RELA             0000000000000000  0002a3e0
  [31] .debug_ranges     PROGBITS         0000000000000000  0000e645
  [32] .rela.debug_range RELA             0000000000000000  0002a458
  [33] .debug_line       PROGBITS         0000000000000000  0000e815
  [34] .rela.debug_line  RELA             0000000000000000  0002a878
  [35] .debug_str        PROGBITS         0000000000000000  0000f4cd
  [38] .debug_frame      PROGBITS         0000000000000000  00016e80
  [39] .rela.debug_frame RELA             0000000000000000  0002a8c0



add symbol table from file "/home/peter/projects/svn/linux_kernel/mmaptest/mmaptest.ko"
at .text_addr = 0x0
(y or n) y
Reading symbols from /home/peter/projects/svn/linux_kernel/mmaptest/mmaptest.ko...done.
(gdb) 

关于c - 内核模块没有找到调试符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28298220/

相关文章:

xml - curl命令在linux上运行完美,但在windows上运行失败

module - Nest.js : Circular dependencies in dynamic modules

c - PlatformIO 中的 avr-gcc 与 Arduino

c# - 如何在不同的机器上调用dll方法?

c - 在linux中拦截执行的命令

c++ - 接收(recv)完整请求(例如curl HTTP)

c - 不同机器之间的差异是什么意思?

c - linux进程调度策略与线程调度策略有什么关系?

module - OCaml:设置模块

module - 模块和存在的区别