2014-09-02 26 views
7

Próbuję skompilować moduł jądra (który sam napisałem) na raspberry pi. Kompiluję go w środowisku docelowym."__aeabi_ldivmod" undefined podczas kompilowania modułu jądra

pojawia się następujący komunikat:

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' 

pewno wystarczy, gdy próbuję wstawić moduł, otrzymuję:

insmod: ERROR: could not insert module ./ppminput.ko: Unknown symbol in module 

i syslog:

Sep 2 22:44:26 pidora kernel: [ 7589.354709] ppminput: Unknown symbol __aeabi_ldivmod (err 0) 

W mój moduł, zidentyfikowałem linię powodującą problem:

unsigned int chan_abs_val = tdiff/CHAN_SCALE; 

(gdzie tdiff to s64, a CHAN_SCALE to liczba całkowita).

Jeśli skomentuję podział, problem zniknie. To jedyna linia wykorzystująca podział w moim module.

Trochę googlowania zwróciło kilka odniesień do tego problemu, ale żaden nie mogłem znaleźć w kontekście kompilowania modułów jądra.

Moje makefile wygląda następująco:

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 

Środowisko szczegóły:

  • Pi jest uruchomiony Pidora 2014 (Fedora 20).
  • Jądro to 3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708.
  • gcc to 4.8.2.

Aktualizacja

I oczywiście nie szukać przy użyciu poprawnych terminów. Another search kupił wiele referencji, ale żadnych rozwiązań jako takich. Czytając je, mam opinię, że nie należy wykonywać żadnych 64-bitowych podziałów wewnątrz jądra, jeśli chce się skompilować na ARM?

Odpowiedz

11

W większości 32-bitowych procesorów 64-bitowy podział musi być zaimplementowany z funkcją wolnej biblioteki. Aby uniemożliwić kompilatorowi generowanie nieoczywistego wolnego kodu, Linux nie implementuje tych funkcji.

Jeśli chcesz wykonać podziały 64-bitowe, musisz je wykonać jawnie. Użyj do_div() z <asm/div64.h>.

+0

HI! I jak zrobić modulo? – flav

+3

@flav Aby zadać pytanie, użyj przycisku "Zadaj pytanie". Lub raczej przeczytaj [dokumentację] (http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/asm-generic/div64.h). –