2014-09-02 108 views
7

我試圖在樹莓派上編譯一個內核模塊(我自己寫了)。我正在編譯目標環境。「__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' 

果然,當我嘗試插入的模塊,我得到:

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

,並在系統日誌:

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 

環境細節:

  • 的皮運行Pidora 2014(Fedora的20)。內核是3.12.21-1.20140626git25673c3.rpfr20.armv6hl.bcm2708。
  • gcc是4.8.2。

更新

我明明沒有搜索使用正確的術語。 Another search已經購買了很多參考文獻,但沒有解決方案。閱讀他們我認爲如果想爲ARM編譯,不應該在內核中執行任何64位分區?

回答

11

在大多數32位CPU上,64位除法必須使用緩慢的庫函數來實現。 爲了防止編譯器生成非常慢的代碼,Linux不實現這些功能。

如果你想做64位的分割,你必須明確地做。 使用do_div()<asm/div64.h>

+0

嗨!以及如何使模數? – flav 2016-12-06 07:17:15

+3

@flav要問一個問題,請使用「提問」按鈕。或者先閱讀[文檔](http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/asm-generic/div64.h)。 – 2016-12-06 07:33:50