2014-09-02 20 views
7

Ahududu pi üzerinde bir çekirdek modül (kendim yazdım) derlemeye çalışıyorum. Hedef ortamda derliyorum. Ben modül eklemek çalışırsanız, ben olsun, yeterÇekirdek modülünü derlerken undefined "__aeabi_ldivmod"

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' 

Emin:

aşağıdaki çıktıyı almak

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

yılında:

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

ve syslog

modülüm, soruna neden olan satırı belirledim:

(burada tdiff bir s64 ve CHAN_SCALE bir tam sayıdır).

Bölünme hakkında yorum yaparsam sorun gider. Bu, modülümdeki bölümü kullanan tek hattır.

Biraz sorun, bu konuyla ilgili birkaç referansa dönüştü, ancak hiçbiri çekirdek modülleri derleme bağlamında bulamadım.

Benim makefile şöyle görünür:

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 

Çevre Ayrıntıları: Pi Pidora 2014 (Fedora 20) çalıştıran

  • .
  • Çekirdek 3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708'dir.
  • gcc, 4.8.2'dir.

Güncelleme

Açıkçası doğru terimler kullanarak arama vermedi. Another search, birçok referansı satın aldı ancak böyle bir çözüm bulunamadı. Bunları okumak, biri ARM için derlemek istiyorsa, çekirdeğin 64bit bölümleri yapmaması gerektiği fikrini alıyorum.

cevap

11

Çoğu 32 bitlik işlemcilerde, 64 bitlik bölüm yavaş bir kitaplık işleviyle uygulanmalıdır. Derleyicinin açık olmayan şekilde yavaş kod üretmesini önlemek için Linux bu işlevleri uygulamıyor.

64-bit bölümler yapmak isterseniz, bunları açıkça yapmanız gerekir. <asm/div64.h>'dan do_div() kullanın.

+0

HI! Ve modulo nasıl yapılır? – flav

+3

@flav Bir soru sormak için "Soru Sor" düğmesini kullanın. Ya da ilk önce [belgeleri] (http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/asm-generic/div64.h) okuyun. –