__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除数),“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内核,我没有检查任何较低的使用

翻译自:https://stackoverflow.com/questions/1063585/udivdi3-undefined-how-to-find-the-code-that-uses-it

转载注明原文:__udivdi3 undefined – 如何找到使用它的代码?