c - "__aeabi_ldivmod"编译内核模块时未定义

标签 c linux-kernel raspberry-pi undefined-symbol

我正在尝试在树莓派上编译一个内核模块(我自己写的)。我在目标环境下编译。

我得到以下输出:

make -C /lib/modules/3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708/build M=/home/harmic/horus/ppminput modules
make[1]: Entering directory `/usr/src/kernels/3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708'
  CC [M]  /home/harmic/horus/ppminput/ppminput.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "__aeabi_ldivmod" [/home/harmic/horus/ppminput/ppminput.ko] undefined!
  CC      /home/harmic/horus/ppminput/ppminput.mod.o
  LD [M]  /home/harmic/horus/ppminput/ppminput.ko
make[1]: Leaving directory `/usr/src/kernels/3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708'

果然,如果我尝试插入模块,我得到:

insmod: ERROR: could not insert module ./ppminput.ko: Unknown symbol in module

在系统日志中:

Sep  2 22:44:26 pidora kernel: [ 7589.354709] ppminput: Unknown symbol __aeabi_ldivmod (err 0)

在我的模块中,我确定了导致问​​题的行:

unsigned int chan_abs_val = tdiff / CHAN_SCALE;

(其中 tdiff 是 s64,CHAN_SCALE 是整数文字)。

如果我将除法注释掉,问题就会消失。这是我模块中唯一使用除法的行。

谷歌搜索找到了一些关于这个问题的引用资料,但我在编译内核模块的上下文中找不到任何引用资料。

我的 makefile 看起来像这样:

obj-m += ppminput.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

环境细节:

  • Pi 正在运行 Pidora 2014 (Fedora 20)。
  • 内核是 3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708。
  • gcc 是 4.8.2。

更新

我显然没有使用正确的术语进行搜索。 Another search买了很多引用资料,但没有解决方案。阅读它们后,我认为如果要为 ARM 编译,不应该在内核中进行任何 64 位除法?

最佳答案

在大多数 32 位 CPU 上,64 位除法必须使用慢速库函数来实现。 为了防止编译器生成非常慢的代码,Linux 没有实现这些功能。

如果你想做 64 位除法,你必须明确地做。 使用 do_div()来自 <asm/div64.h> .

关于c - "__aeabi_ldivmod"编译内核模块时未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25623956/

相关文章:

c - 从边缘检测器输出中修剪短线段?

c - 这个C语言程序有什么问题吗?

copy_to_user 未返回预期数据

linux - CFS中vruntime是什么概念

c - 在 C 编程中,for(int i=0; st[i]; i++) 和 for(int i=0; i<st[length of the array];i++) 有什么区别

c - 为 Linux 内核编写内置对象?

database - 从 Linux shell 与 .db 文件交互

python - 在树莓派上安装pypy3

python - 使用 pip freeze 安装 numpy

c - header 未找到 typedef 的结构