【问题标题】:unknown USB symbols in antique module for linux kernel 2.6.27linux内核2.6.27的古董模块中的未知USB符号
【发布时间】: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


【解决方案1】:

我从 Jungo 下载了最新版本的驱动程序,它构建得很好。当我换出源代码文件但使用旧的配置和生成文件脚本时,问题又回来了。那么,无论是什么问题,都是由于模块的编译或安装问题造成的。无论如何,我现在已经安装了驱动程序。

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 2012-08-06
    • 2021-06-13
    • 2014-03-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多