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

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

"__udivdi3" [mymodule.ko] undefined!

"__umoddi3" [mymodule.ko] undefined!

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

我如何找到发出64位操作的代码。很难手动找到它们,因为我无法轻松地检查“

/”是32位还是64位。如果未定义“普通”函数,则可以对它们进行grep,但这在这里是不可能的。还有另一种搜索参考文献的好方法吗?某种“机器代码grep”?

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

回答:

首先,您可以使用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内核,我还没有检查使用率是否更低

以上是 __udivdi3 undefined —如何找到使用它的代码? 的全部内容, 来源链接: utcz.com/qa/412300.html

回到顶部