【问题标题】:kernel module no debugging symbols found内核模块未找到调试符号
【发布时间】:2015-04-02 14:35:30
【问题描述】:

在我加载 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?

【问题讨论】:

标签: c linux module gdb kernel


【解决方案1】:

我的标志不正确。调试符号表是用这个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) 

【讨论】:

  • 但是为什么所有的地址还是0x000000000000?
  • 如果节将出现在进程的内存映像中,则地址成员将给出节的第一个字节应驻留的地址。否则,该成员将包含 0。您可以点击链接了解更多信息skyfree.org/linux/references/ELF_Format.pdf
  • @Sridhar 当然,它是 .o 文件(.ko),因此地址是相对的,由偏移量给出。无论如何,感谢您对 7f454c46 的精彩介绍。
  • 但我仍然看不到我的符号。当我执行“whatis mysym_1”时,我得到的类型为 int,但是当我执行“p mysym_1”时,我得到一个错误 - 无法访问 0x0 处的内存。可能是什么问题?
  • 为什么在添加了ccflags-y += ${MY_CFLAGS}之后还要添加CC += ${MY_CFLAGS}??
猜你喜欢
  • 2014-11-20
  • 2012-08-06
  • 2014-03-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多