在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”可能会被多次评估。
do_div
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获取带源注释的反汇编。
long long int
uint64_t
-g
objdump -S
注意: 这适用于2.6内核,我还没有检查使用率是否更低