【发布时间】:2014-09-02 23:39:10
【问题描述】:
我正在尝试恢复一个名为 Wind River v6 (wndrvr6) 的旧 linux USB 模块,该模块最初是为 2.6.18 或更早的内核编写的,可能是 RedHat 5。我设法在 Virtualbox 下充分运行的最旧内核是 2.6 Fedora 9 中的 .27,除了这个模块外,一切正常。我对源代码进行了大约 10 处更改以使其与 2.6.27 一起编译,但是当我尝试加载它时,我得到了
windrvr6:未知符号 usb_alloc_urb
windrvr6:未知符号 usb_free_urb
windrvr6:未知符号 usb_ifnum_to_if
windrvr6:未知符号 usb_register_driver
windrvr6:未知符号 usb_clear_halt
windrvr6:未知符号 usb_submit_urb
windrvr6:未知符号 usb_set_interface
windrvr6:未知符号 usb_deregister
windrvr6:未知符号 usb_kill_urb
我已经运行了“depmod -a”,而“depmod -e”没有输出,所以应该考虑所有符号。上面的符号出现在许多模块中(使用 strings 命令)。 /proc/kallsyms 有一行
ffffffff811efc29 T usb_kill_urb
所以提供了这些符号。为什么找不到这些符号?
【问题讨论】:
-
usb_kill_urb 使用 EXPORT_SYMBOL_GPL() 导出。 windrvr6驱动的授权是什么?这可能是链接失败的原因。在此处查看 USB 核心代码:lxr.free-electrons.com/source/drivers/usb/core/urb.c?v=3.3#L615
-
代码说要查看“\windriver\docs\license.txt”,但赛灵思没有将 docs 目录包含在源代码中。上次我写一个设备驱动程序时,没有检查许可。此驱动程序仅调用 EXPORT_SYMBOL() 和 EXPORT_SYMBOL_NOVERS()。源代码中有一些关于许可的代码,但它是一个由曲折的小宏组成的迷宫,都一样。
-
我认为 EXPORT_SYMBOL_NOVERS() 不再适用于 2.6.x 以上的大多数内核。在过去的 6 个月中,我在使用 modversioning 时遇到了类似的问题。无论如何,这并不重要,因为模块许可政策不考虑版本控制而是许可,这将使用 MODULE_LICENSE() 宏进行宣传。设计意图是防止闭源驱动程序使用 GPL 许可代码。您还可以选择将驱动程序构建为内核的一部分。请参阅lxr.free-electrons.com/source/include/linux/export.h#L89 了解这是如何在内核中实现的。
-
这个驱动程序实际上叫做 WinDriver(来自 Jungo),拼写为
windrvr6。这可能有助于您的 Google 搜索。许多声称需要 windrvr6 的设备(例如 Xilinx FPGA 编程器)现在实际上与 libusb 兼容,并且根本不再需要 windrvr6。 -
EXPORT_SYMBOL_NOVERS() 被调用用于传出符号,而不是传入符号。这可能是一个问题,但它与我现在遇到的问题无关。此外,与现代 libusb 的兼容性对我没有好处,因为我正在尝试从 2008 年开始运行 libusb。
标签: module linux-kernel virtualbox fedora