har*_*mic 8 c linux-kernel undefined-symbol raspberry-pi
我正在尝试在raspberry 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'
Run Code Online (Sandbox Code Playgroud)
果然,如果我尝试插入模块,我得到:
insmod: ERROR: could not insert module ./ppminput.ko: Unknown symbol in module
Run Code Online (Sandbox Code Playgroud)
在syslog中:
Sep 2 22:44:26 pidora kernel: [ 7589.354709] ppminput: Unknown symbol __aeabi_ldivmod (err 0)
Run Code Online (Sandbox Code Playgroud)
在我的模块中,我已经确定导致问题的行:
unsigned int chan_abs_val = tdiff / CHAN_SCALE;
Run Code Online (Sandbox Code Playgroud)
(其中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
Run Code Online (Sandbox Code Playgroud)
环境细节:
更新
我显然没有使用正确的术语进行搜索.另一个搜索已经购买了许多参考资料,但没有这样的解决方案.阅读它们我得到的意见是,如果想为ARM编译,那么内核中不应该执行任何64位分区?
CL.*_*CL. 13
在大多数32位CPU上,必须使用慢库函数实现64位除法.为了防止编译器生成非常慢的代码,Linux不实现这些功能.
如果要进行64位除法,则必须明确地执行这些操作.使用do_div()从<asm/div64.h>.