编译内核模块时“__aeabi_ldivmod”未定义

时间:2014-09-02 12:55:40

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

我试图在覆盆子pi上编译一个内核模块(我自己写的)。我正在目标环境中编译它。

我得到以下输出:

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

并在syslog中:

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位分区吗?

1 个答案:

答案 0 :(得分:12)

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

如果要进行64位除法,则必须明确执行这些操作。 使用do_div()中的<asm/div64.h>