一尘不染

__udivdi3 undefined —如何找到使用它的代码?

linux

在32位Linux内核上编译内核模块会导致

"__udivdi3" [mymodule.ko] undefined!
"__umoddi3" [mymodule.ko] undefined!

在64位系统上,一切都很好。据我所知,其原因是32位Linux内核不支持64位整数除法和取模。

我如何找到发出64位操作的代码。很难手动找到它们,因为我无法轻松地检查“
/”是32位还是64位。如果未定义“普通”函数,则可以对它们进行grep,但这在这里是不可能的。还有另一种搜索参考文献的好方法吗?某种“机器代码grep”?

该模块包含数千行代码。我真的不能手动检查每一行。


阅读 460

收藏
2020-06-07

共1个答案

一尘不染

首先,您可以使用do_div宏进行64位分割。(请注意,原型为uint32_t do_div(uint64_t dividend, uint32_t divisor),并且“ dividend”可能会被多次评估。

{
    unsigned long long int x = 6;
    unsigned long int y = 4;
    unsigned long int rem;

    rem = do_div(x, y);
    /* x now contains the result of x/y */
}

此外,您应该能够在代码中找到long long int(或uint64_t)类型的用法,或者可以-g使用标志构建模块并用于objdump -S获取带源注释的反汇编。

注意: 这适用于2.6内核,我还没有检查使用率是否更低

2020-06-07