__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