如何为可加载的Linux内核模块构建调试信息(如vmlinux中的内核 - uname -r
。debug?)它是在我们构建模块时生成的,如果是的话,它将在何处定位?< / p>
答案 0 :(得分:8)
假设您使用CONFIG_DEBUG_INFO构建了内核,调试符号应该已经存在于相关模块的.ko文件中。但是,由于模块可以在任何地址动态加载,因此需要为gdb提供更多信息。
cd /sys/module/${MODNAME}/sections
cat .text .data .bss
然后,在告诉GDB有关模块时,您可以使用此信息:
(gdb) add-symbol-file ${MODPATH} ${TEXT} -s .data ${DATA} -s .bss ${BSS}
有一个教程可以在Linux Foundation网站上引导您完成此操作。 Kernel and Module Debugging with GDB
答案 1 :(得分:5)
#Modify your Makefile like this then build it
#cat /sys/module/mydriver/sections/.text -> find the address
#Then run like add-symbol-file drivers/mydrivers/mydriver.o address from above #line
obj-m += module_name.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