警告:“__aeabi_uldivmod”opendla.ko 中的未定义符号

WARNING: "__aeabi_uldivmod" Undefined symbol in opendla.ko

我正在尝试构建内核模块驱动程序(KMD) for NVDLA NVIDIA 的深度学习加速器,最后出现以下错误。 enter image description here

在对 google 进行一些研究后,我发现这是由于 kmd 中存在的 64 位操作(尤其是 64 位除法)导致了错误。经过进一步调查,我发现 kmd 是为 64 位架构编写的,而我正在尝试为 32 位(ARM cortex A9)处理器编译它。网上有人建议使用-lgcc,这样可以解决问题。

任何人都可以帮助我将 makefile 编辑为 link linker 库 libgcc。

提前致谢。

Linux使用64位除法的内核代码应该使用#include <linux/math64.h>提供的函数。否则,在构建 32 位架构时,GCC 将尝试使用内核未使用的 libgcc 中的函数。

例如,div_u64 函数将 64 位无符号被除数除以 32 位无符号除数和 returns 64 位无符号商。 OP引用的KMD代码包含这个函数:

int64_t dla_get_time_us(void)
{
    return ktime_get_ns() / NSEC_PER_USEC;
}

添加#include <linux/math64.h>后,可以改写为使用div_u64函数如下:

int64_t dla_get_time_us(void)
{
    return div_u64(ktime_get_ns(), NSEC_PER_USEC);
}

(请注意,ktime_get_ns() returns a u64(无符号 64 位整数)和 NSEC_PER_USEC 的值为 1000,因此可用作 32-位除数。)

代码中可能还有其他地方使用了 64 位除法,但这是我发现的第一个。