未定义对“ cnss_get_platform_cap”的引用

时间:2018-08-10 11:28:13

标签: android c linux-kernel kernel

我正在编译Android Kernel 3.18。 我收到此错误

drivers/built-in.o: In function `enable_extldo':
/home/vinay/customKernel/3.18/kernel_yu_msm8937/drivers/bluetooth/bluetooth-power.c:307: undefined reference to `cnss_get_platform_cap'
/home/vinay/customKernel/3.18/kernel_yu_msm8937/drivers/bluetooth/bluetooth-power.c:307:(.text+0x5c45bc): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `cnss_get_platform_cap'
Makefile:951: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1

这里是source code 我正在使用 aarch64-linux-android-4.9 工具链

1 个答案:

答案 0 :(得分:0)

当我尝试为MI设备编译内核时,遇到了相同的问题。

首先,您可以看到函数cnss_get_platform_cap是在包含/网络中的cnss.h中声明的:

enter image description here

打开此文件,您会发现此函数被声明为外部函数:

enter image description here

所以这里只是一个声明,不是一个实现。

然后我们在函数的位置进行了挖掘,我使用find命令查找了所有与cnss相关的驱动程序文件,并且我发现此函数是在./net/wireless/cnss/cnss_pci.c中实现的

enter image description here

如我们所见,该函数在此处,编译后将成为导出的符号。

enter image description here

您可以记录您的编译过程,并且发现实际上可以成功编译bluetooth-power.c

enter image description here

仅当makefile链接vmlinux时,就会出现问题。所以我们到了。我搜索了日志,但没有发现cnss_pci.c曾经被编译过,只有cnss_common.c被编译了,让我们在net / wireless / cnss /

中打开子makefile。

enter image description here

您会发现需要在defconfig文件中添加一个项目来编译cnss_pci.c的{​​{1}}。我将其添加到'CONFIG_CNSS_PCI=y'中的defconfig文件中,并且解决了这个问题。

我只是试图将供应商补丁合并到较新的CAF内核中,即使使用自动合并也存在许多语法错误。 至于逻辑错误和错误,我不知道。很多事情需要学习。 希望你找到出路。