"Unknown symbol" 来自内核模块(dm9601 驱动程序),这是否需要重建内核?
"Unknown symbol" from kernel module (dm9601 driver), does this require a rebuild of the kernel?
这是路由器 运行 内核版本 2.6.21.5。
我正在使用官方 (netgear) 源代码树和工具链。
我已经使用工具链编译了 dm9601.c 驱动程序(来自源代码树),但是在插入模块 dmesg 后打印:
dm9601: Unknown symbol mii_link_ok
dm9601: Unknown symbol bitrev32
dm9601: Unknown symbol mii_check_media
dm9601: Unknown symbol usbnet_get_settings
dm9601: Unknown symbol crc32_le
dm9601: Unknown symbol mii_nway_restart
dm9601: Unknown symbol usbnet_nway_reset
dm9601: Unknown symbol generic_mii_ioctl
dm9601: Unknown symbol usbnet_set_settings
dm9601: Unknown symbol mii_ethtool_gset
引用(好像)
./lib/crc32.c
./lib/bitrev.c
./drivers/net/mii.c
./drivers/usb/net/usbnet.c
有什么方法可以判断这些缺失的依赖项是否需要重建内核。或者我可以用驱动程序加载它们吗?
生成文件:
obj-m += dm9601.o
all:
make -C /home/chris/DGND3300_V1.1.00.41_NA_src M=$(PWD) modules
clean:
make -C /home/chris/DGND3300_V1.1.00.41_NA_src M=$(PWD) clean
制作命令:
make ARCH=mips CROSS_COMPILE="/home/chris/EVG2000_v2.2.0.12_with_toolchain_src/uclibc-crosstools-gcc-4.2.3-3/usr/bin/mips-linux-uclibc-"
更新的 Makefile 缺少模块:
obj-m += crc32.o
obj-m += bitrev.o
obj-m += mii.o
obj-m += usbnet.o
obj-m += dm9601.o
all:
make -C /home/chris/messabout3/DGND3300_V1.1.00.41_NA_src/kernel/linux M=$(PWD) modules
clean:
make -C /home/chris/messabout3/DGND3300_V1.1.00.41_NA_src/kernel/linux M=$(PWD) clean
首先检查,如果符号是内核符号列表的一部分,
例如:cat /proc/kallsyms | grep mii_link_ok
如果符号不存在,则需要使用 EXPORT_SYMBOL() 或 EXPORT_SYMBOL_GPL() 导出这些符号.
如果存在符号,请尝试以下操作之一,
- 在将使用导出函数或变量的内核模块的 Makefile 中包含 **KBUILD_EXTRA_SYMBOLS=<"absolute path to the Module.symvers of the kernel module which is exporting function or variable">,在您的情况下为 dm9601 Makefile。
例如:KBUILD_EXTRA_SYMBOLS := absolute_path_to_Module.symvers_of_mii
EXPORT_SYMBOL in kernel module | undefined symbol during insmod
- 列表项
Unknown symbol in while loading a kernel module
希望这能解决问题![=14=]
这是路由器 运行 内核版本 2.6.21.5。
我正在使用官方 (netgear) 源代码树和工具链。
我已经使用工具链编译了 dm9601.c 驱动程序(来自源代码树),但是在插入模块 dmesg 后打印:
dm9601: Unknown symbol mii_link_ok
dm9601: Unknown symbol bitrev32
dm9601: Unknown symbol mii_check_media
dm9601: Unknown symbol usbnet_get_settings
dm9601: Unknown symbol crc32_le
dm9601: Unknown symbol mii_nway_restart
dm9601: Unknown symbol usbnet_nway_reset
dm9601: Unknown symbol generic_mii_ioctl
dm9601: Unknown symbol usbnet_set_settings
dm9601: Unknown symbol mii_ethtool_gset
引用(好像)
./lib/crc32.c
./lib/bitrev.c
./drivers/net/mii.c
./drivers/usb/net/usbnet.c
有什么方法可以判断这些缺失的依赖项是否需要重建内核。或者我可以用驱动程序加载它们吗?
生成文件:
obj-m += dm9601.o
all:
make -C /home/chris/DGND3300_V1.1.00.41_NA_src M=$(PWD) modules
clean:
make -C /home/chris/DGND3300_V1.1.00.41_NA_src M=$(PWD) clean
制作命令:
make ARCH=mips CROSS_COMPILE="/home/chris/EVG2000_v2.2.0.12_with_toolchain_src/uclibc-crosstools-gcc-4.2.3-3/usr/bin/mips-linux-uclibc-"
更新的 Makefile 缺少模块:
obj-m += crc32.o
obj-m += bitrev.o
obj-m += mii.o
obj-m += usbnet.o
obj-m += dm9601.o
all:
make -C /home/chris/messabout3/DGND3300_V1.1.00.41_NA_src/kernel/linux M=$(PWD) modules
clean:
make -C /home/chris/messabout3/DGND3300_V1.1.00.41_NA_src/kernel/linux M=$(PWD) clean
首先检查,如果符号是内核符号列表的一部分,
例如:cat /proc/kallsyms | grep mii_link_ok
如果符号不存在,则需要使用 EXPORT_SYMBOL() 或 EXPORT_SYMBOL_GPL() 导出这些符号.
如果存在符号,请尝试以下操作之一,
- 在将使用导出函数或变量的内核模块的 Makefile 中包含 **KBUILD_EXTRA_SYMBOLS=<"absolute path to the Module.symvers of the kernel module which is exporting function or variable">,在您的情况下为 dm9601 Makefile。
例如:KBUILD_EXTRA_SYMBOLS := absolute_path_to_Module.symvers_of_mii
EXPORT_SYMBOL in kernel module | undefined symbol during insmod
- 列表项
Unknown symbol in while loading a kernel module
希望这能解决问题![=14=]