"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>.