多个ko模块引用同一内核文件里的 EXPORT 函数出现 undefined 错误

大哥您好 2017-07-12 11:12:23
大哥们好!
今天编译驱动遇到如下问题,我简要说明如下:

A.c 编译进内核 A.o
B.c 和 C.c 都编译成模块 B.ko 和 C.ko

B需要引用A的函数 a(), b1(),b2();
C需要引用A的函数 a(),c1(),c2();

当B或C只有一个编译成ko时(另外一个编译进内核),都可以编译通过;
当B和C都编译成ko时,上述需引用A的函数全部提示undefined,编译失败。

请大哥们指导,谢谢!!!
...全文
1109 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
大哥您好 2017-07-13
  • 打赏
  • 举报
回复
引用 14 楼 falloutmx 的回复:
你这是把驱动都放在内核驱动路径下了吧? 最后执行的时候是make uImage然后再make modules的吗?
你这是把驱动都放在内核驱动路径下了吧? 是的,放到drivers/usb/host/ 目录下 最后执行的时候是make uImage然后再make modules的吗? 是的,building kernel是ok的,building modules, stage 2 就出现上述错误
falloutmx 2017-07-13
  • 打赏
  • 举报
回复
你这是把驱动都放在内核驱动路径下了吧? 最后执行的时候是make uImage然后再make modules的吗?
大哥您好 2017-07-13
  • 打赏
  • 举报
回复
引用 10 楼 falloutmx 的回复:
跟makefile有关系,贴出来看看吧。
大哥您好,makefile已经贴出来了,在你的上一楼就是
大哥您好 2017-07-13
  • 打赏
  • 举报
回复
引用 11 楼 jklinux 的回复:
[quote=引用 9 楼 u014485786 的回复:] [quote=引用 8 楼 jklinux 的回复:] makefile贴一下咯
# # Makefile for USB Host Controller Drivers # ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG isp1760-y := isp1760-hcd.o isp1760-if.o fhci-y := fhci-hcd.o fhci-hub.o fhci-q.o fhci-y += fhci-mem.o fhci-tds.o fhci-sched.o fhci-$(CONFIG_FHCI_DEBUG) += fhci-dbg.o xhci-hcd-y := xhci.o xhci-mem.o xhci-hcd-y += xhci-ring.o xhci-hub.o xhci-dbg.o xhci-hcd-$(CONFIG_PCI) += xhci-pci.o ifneq ($(CONFIG_USB_XHCI_PLATFORM), ) xhci-hcd-y += xhci-plat.o endif obj-$(CONFIG_USB_WHCI_HCD) += whci/ obj-$(CONFIG_PCI) += pci-quirks.o obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o obj-$(CONFIG_USB_EHCI_HCD_PLATFORM) += ehci-platform.o obj-$(CONFIG_USB_EHCI_MXC) += ehci-mxc.o obj-$(CONFIG_USB_EHCI_HCD_OMAP) += ehci-omap.o obj-$(CONFIG_USB_EHCI_HCD_ORION) += ehci-orion.o obj-$(CONFIG_USB_EHCI_HCD_SPEAR) += ehci-spear.o obj-$(CONFIG_USB_EHCI_S5P) += ehci-s5p.o obj-$(CONFIG_USB_EHCI_HCD_SYNOPSYS) += ehci-h20ahb.o obj-$(CONFIG_USB_EHCI_HCD_AT91) += ehci-atmel.o obj-$(CONFIG_USB_EHCI_MSM) += ehci-msm.o obj-$(CONFIG_USB_OXU210HP_HCD) += oxu210hp-hcd.o obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o obj-$(CONFIG_USB_ISP1362_HCD) += isp1362-hcd.o obj-$(CONFIG_USB_OHCI_HCD) += ohci-hcd.o obj-$(CONFIG_USB_UHCI_HCD) += uhci-hcd.o obj-$(CONFIG_USB_FHCI_HCD) += fhci.o obj-$(CONFIG_USB_XHCI_HCD) += xhci-hcd.o obj-$(CONFIG_USB_SL811_HCD) += sl811-hcd.o obj-$(CONFIG_USB_SL811_CS) += sl811_cs.o obj-$(CONFIG_USB_U132_HCD) += u132-hcd.o obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o obj-$(CONFIG_USB_HWA_HCD) += hwa-hc.o obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o obj-$(CONFIG_USB_TEST) += usb_test.o 标红的是要编译成ko的B跟C,最后一个标蓝的是公共的A [/quote] 我晕,这些都是比较重要的文件好不好。 ehci-hcd.o ohci-hcd.o都是关于usb控制器的驱好,一个版本是usb2.0, usb1.1 usb_test.o是要调用usb控制器驱动接口的usb设备驱动,前面的两个驱动肯定不会用到usb_test. 只有usb_test会调用到前面的驱动。 当前面两个控制器驱动都编成模块的话,可能usb_test也需要编成模块才行[/quote大哥,我在做测试嘛,usb我懂,我是在usb_test里面加了一些调试接口给ehci和ohci调用的,现在只是编译不过而已,暂不用考虑代码逻辑吧
大哥您好 2017-07-13
  • 打赏
  • 举报
回复
确实是跟 Makefile 有关系,不过是需要修改上层目录的 Makefile,也就是 driver/usb/ 目录下的Makefile: 需要加上一行(标蓝): # # Makefile for the kernel USB device drivers. # # Object files in subdirectories obj-$(CONFIG_USB) += core/ obj-$(CONFIG_USB_SUPPORT) += phy/ obj-$(CONFIG_USB_DWC3) += dwc3/ obj-$(CONFIG_USB_DWC2) += dwc2/ obj-$(CONFIG_USB_ISP1760) += isp1760/ obj-$(CONFIG_USB_MON) += mon/ obj-$(CONFIG_USB_TEST) += host/ obj-$(CONFIG_PCI) += host/ obj-$(CONFIG_USB_EHCI_HCD) += host/ obj-$(CONFIG_USB_ISP116X_HCD) += host/ obj-$(CONFIG_USB_OHCI_HCD) += host/ obj-$(CONFIG_USB_UHCI_HCD) += host/ obj-$(CONFIG_USB_FHCI_HCD) += host/ ...... ...... ...... 谢谢各位大哥指导!
jklinux 2017-07-12
  • 打赏
  • 举报
回复
两个模块一起编译试试, 也就是共用一个Makefile. Makefile里: obj-m += B.o obj-m += C.o ...
jklinux 2017-07-12
  • 打赏
  • 举报
回复
引用 9 楼 u014485786 的回复:
[quote=引用 8 楼 jklinux 的回复:] makefile贴一下咯
# # Makefile for USB Host Controller Drivers # ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG isp1760-y := isp1760-hcd.o isp1760-if.o fhci-y := fhci-hcd.o fhci-hub.o fhci-q.o fhci-y += fhci-mem.o fhci-tds.o fhci-sched.o fhci-$(CONFIG_FHCI_DEBUG) += fhci-dbg.o xhci-hcd-y := xhci.o xhci-mem.o xhci-hcd-y += xhci-ring.o xhci-hub.o xhci-dbg.o xhci-hcd-$(CONFIG_PCI) += xhci-pci.o ifneq ($(CONFIG_USB_XHCI_PLATFORM), ) xhci-hcd-y += xhci-plat.o endif obj-$(CONFIG_USB_WHCI_HCD) += whci/ obj-$(CONFIG_PCI) += pci-quirks.o obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o obj-$(CONFIG_USB_EHCI_HCD_PLATFORM) += ehci-platform.o obj-$(CONFIG_USB_EHCI_MXC) += ehci-mxc.o obj-$(CONFIG_USB_EHCI_HCD_OMAP) += ehci-omap.o obj-$(CONFIG_USB_EHCI_HCD_ORION) += ehci-orion.o obj-$(CONFIG_USB_EHCI_HCD_SPEAR) += ehci-spear.o obj-$(CONFIG_USB_EHCI_S5P) += ehci-s5p.o obj-$(CONFIG_USB_EHCI_HCD_SYNOPSYS) += ehci-h20ahb.o obj-$(CONFIG_USB_EHCI_HCD_AT91) += ehci-atmel.o obj-$(CONFIG_USB_EHCI_MSM) += ehci-msm.o obj-$(CONFIG_USB_OXU210HP_HCD) += oxu210hp-hcd.o obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o obj-$(CONFIG_USB_ISP1362_HCD) += isp1362-hcd.o obj-$(CONFIG_USB_OHCI_HCD) += ohci-hcd.o obj-$(CONFIG_USB_UHCI_HCD) += uhci-hcd.o obj-$(CONFIG_USB_FHCI_HCD) += fhci.o obj-$(CONFIG_USB_XHCI_HCD) += xhci-hcd.o obj-$(CONFIG_USB_SL811_HCD) += sl811-hcd.o obj-$(CONFIG_USB_SL811_CS) += sl811_cs.o obj-$(CONFIG_USB_U132_HCD) += u132-hcd.o obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o obj-$(CONFIG_USB_HWA_HCD) += hwa-hc.o obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o obj-$(CONFIG_USB_TEST) += usb_test.o 标红的是要编译成ko的B跟C,最后一个标蓝的是公共的A [/quote] 我晕,这些都是比较重要的文件好不好。 ehci-hcd.o ohci-hcd.o都是关于usb控制器的驱好,一个版本是usb2.0, usb1.1 usb_test.o是要调用usb控制器驱动接口的usb设备驱动,前面的两个驱动肯定不会用到usb_test. 只有usb_test会调用到前面的驱动。 当前面两个控制器驱动都编成模块的话,可能usb_test也需要编成模块才行
falloutmx 2017-07-12
  • 打赏
  • 举报
回复
跟makefile有关系,贴出来看看吧。
大哥您好 2017-07-12
  • 打赏
  • 举报
回复
引用 8 楼 jklinux 的回复:
makefile贴一下咯
# # Makefile for USB Host Controller Drivers # ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG isp1760-y := isp1760-hcd.o isp1760-if.o fhci-y := fhci-hcd.o fhci-hub.o fhci-q.o fhci-y += fhci-mem.o fhci-tds.o fhci-sched.o fhci-$(CONFIG_FHCI_DEBUG) += fhci-dbg.o xhci-hcd-y := xhci.o xhci-mem.o xhci-hcd-y += xhci-ring.o xhci-hub.o xhci-dbg.o xhci-hcd-$(CONFIG_PCI) += xhci-pci.o ifneq ($(CONFIG_USB_XHCI_PLATFORM), ) xhci-hcd-y += xhci-plat.o endif obj-$(CONFIG_USB_WHCI_HCD) += whci/ obj-$(CONFIG_PCI) += pci-quirks.o obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o obj-$(CONFIG_USB_EHCI_HCD_PLATFORM) += ehci-platform.o obj-$(CONFIG_USB_EHCI_MXC) += ehci-mxc.o obj-$(CONFIG_USB_EHCI_HCD_OMAP) += ehci-omap.o obj-$(CONFIG_USB_EHCI_HCD_ORION) += ehci-orion.o obj-$(CONFIG_USB_EHCI_HCD_SPEAR) += ehci-spear.o obj-$(CONFIG_USB_EHCI_S5P) += ehci-s5p.o obj-$(CONFIG_USB_EHCI_HCD_SYNOPSYS) += ehci-h20ahb.o obj-$(CONFIG_USB_EHCI_HCD_AT91) += ehci-atmel.o obj-$(CONFIG_USB_EHCI_MSM) += ehci-msm.o obj-$(CONFIG_USB_OXU210HP_HCD) += oxu210hp-hcd.o obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o obj-$(CONFIG_USB_ISP1362_HCD) += isp1362-hcd.o obj-$(CONFIG_USB_OHCI_HCD) += ohci-hcd.o obj-$(CONFIG_USB_UHCI_HCD) += uhci-hcd.o obj-$(CONFIG_USB_FHCI_HCD) += fhci.o obj-$(CONFIG_USB_XHCI_HCD) += xhci-hcd.o obj-$(CONFIG_USB_SL811_HCD) += sl811-hcd.o obj-$(CONFIG_USB_SL811_CS) += sl811_cs.o obj-$(CONFIG_USB_U132_HCD) += u132-hcd.o obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o obj-$(CONFIG_USB_HWA_HCD) += hwa-hc.o obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o obj-$(CONFIG_USB_TEST) += usb_test.o 标红的是要编译成ko的B跟C,最后一个标蓝的是公共的A
jklinux 2017-07-12
  • 打赏
  • 举报
回复
makefile贴一下咯
大哥您好 2017-07-12
  • 打赏
  • 举报
回复
引用 6 楼 jklinux 的回复:
代码里没extern声明函数吗? 确定是错误吗?,有警告是正常的
是错误来的,编译失败 A文件里的函数均已EXPORT,B,C文件需引用A的文件均已extern声明 而且单独编B或C成ko是可以的,就是一起变成ko不行
jklinux 2017-07-12
  • 打赏
  • 举报
回复
代码里没extern声明函数吗? 确定是错误吗?,有警告是正常的
大哥您好 2017-07-12
  • 打赏
  • 举报
回复
引用 4 楼 jklinux 的回复:
[quote=引用 2 楼 u014485786 的回复:] [quote=引用 1 楼 jklinux 的回复:] 两个模块一起编译试试, 也就是共用一个Makefile. Makefile里: obj-m += B.o obj-m += C.o ...
您好!目前三个文件都是在同一个Makefile里面的[/quote] 这很神奇啊,具体怎样?[/quote]错误类似: ERROR: "XXXXXXX(函数名)" [drivers/xxxxxx/B.ko] undefined! ERROR: "XXXXXXX(函数名)" [drivers/xxxxxx/B.ko] undefined! ERROR: "XXXXXXX(函数名)" [drivers/xxxxxx/C.ko] undefined! 没有其他提示了
jklinux 2017-07-12
  • 打赏
  • 举报
回复
引用 2 楼 u014485786 的回复:
[quote=引用 1 楼 jklinux 的回复:] 两个模块一起编译试试, 也就是共用一个Makefile. Makefile里: obj-m += B.o obj-m += C.o ...
您好!目前三个文件都是在同一个Makefile里面的[/quote] 这很神奇啊,具体怎样?
jklinux 2017-07-12
  • 打赏
  • 举报
回复
具体错误贴一下咯……
大哥您好 2017-07-12
  • 打赏
  • 举报
回复
引用 1 楼 jklinux 的回复:
两个模块一起编译试试, 也就是共用一个Makefile. Makefile里: obj-m += B.o obj-m += C.o ...
您好!目前三个文件都是在同一个Makefile里面的

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧