【发布时间】:2014-10-26 18:03:03
【问题描述】:
我正在尝试在树莓派上编译一个内核模块(我自己编写的)。我在目标环境下编译。
我得到以下输出:
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 位划分?
【问题讨论】:
标签: c linux-kernel raspberry-pi undefined-symbol