在 32 位 Linux 内核上编译内核模块导致
"__udivdi3" [mymodule.ko] undefined!
"__umoddi3" [mymodule.ko] undefined!
在 64 位系统上一切正常。据我所知,这是因为 32 位 Linux 内核不支持 64 位整数除法和取模。
如何找到发布 64 位操作的代码。它们很难手动找到,因为我无法轻易检查“/”是 32 位宽还是 64 位宽。如果“普通”函数未定义,我可以对它们进行 grep,但这在这里是不可能的。还有另一种搜索引用文献的好方法吗?某种“机器代码 grep”?
该模块由几千行代码组成。我真的无法手动检查每一行。
最佳答案
首先,您可以使用 do_div
宏进行 64 位除法。 (注意原型(prototype)是 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 内核,我没有检查任何更低版本的用法
关于c - __udivdi3 undefined — 如何找到使用它的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33964538/