在32位Linux内核上编译内核模块导致
"__udivdi3" [mymodule.ko] undefined!
"__umoddi3" [mymodule.ko] undefined!
在64位系统上一切都很好。据我所知,原因是32位Linux内核不支持64位整数除法和取模。
我该如何找到执行64位操作的代码?它们很难手动查找,因为我不能轻易地检查“/”是否为32位宽度或64位宽度。如果“正常”的函数未定义,我可以使用grep来搜索它们,但这在此处不可能。有没有其他好的方法来搜索引用?某种“机器码grep”?
该模块由几千行代码组成。我真的无法手动检查每一行。
__udivdi3
等。它们很容易实现,如果你用汇编语言实现,它们将比 libgcc 的版本更高效(可能快 2-3 倍)。 - R.. GitHub STOP HELPING ICE-g
标志是为了 GCC(因此对象包括调试信息),应该放在CFLAGS_MODULE
中,objdump 将在生成的目标文件上运行。 - Hasturkunobjdump -Sr
命令会给你提供一个带有重定向的注释汇编代码,你应该能够在那里找到对__udivdi3
的调用。 - Hasturkun