"aeabi ldivmod" не определено при компиляции модуля ядра
Я пытаюсь скомпилировать модуль ядра (который я написал сам) на 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'
конечно, если я попытаюсь вставить модуль, я получу:
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.
обновление
Я, очевидно, не искал, используя правильные термины. еще один поиск скупил много ссылок, но никаких решений как таковых. Читая их, я получаю мнение, что не следует делать никаких 64-битных делений внутри ядра, если вы хотите скомпилировать для ARM?
1 ответов
на большинстве 32-разрядных процессоров 64-разрядное разделение должно быть реализовано с медленной библиотечной функцией. Чтобы предотвратить компилятор генерирует unobviously медленный код, линукс не реализует эти функции.
Если вы хотите сделать 64-разрядные подразделения, Вы должны сделать их явно.
Использовать do_div()
с <asm/div64.h>
.