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

标签 c linux linux-kernel kernel

在 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/

相关文章:

objective-c - 我应该使用 NSNumber 而不是基本的 C 数字类型吗?

c - 在 C 中读取 CAN 总线显示 29 位 CAN ID 的 CAN ID 不正确

c - 在 C 中与程序同时运行线程

linux - Netfilter Hook 注册到网络子系统

linux - 由于与内核固件包冲突,自定义内核 rpm 无法安装

c++ - gnu缩进的谷歌c风格设置?

在 C 中使用 typedef 创建泛型

c++ - fun(...) 和 (*fun)(...) 在 C/C++ 中使用函数指针有什么区别

python - 如何在 bash 脚本中导入 python 文件? (在我的 bash 脚本中使用 python 值)

linux - module_platform_driver初始化顺序