2014-09-02 8 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 

और 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; 

(जहां टीडीएफ एक एस 64 है, और 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 (फेडोरा 20) चल रहा है।
  • कर्नेल 3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708 है।
  • जीसीसी 4.8.2 है।

अद्यतन

मैं स्पष्ट रूप से सही शब्दों का उपयोग करके खोज नहीं की थी। Another search ने कई संदर्भ खरीदे हैं, लेकिन इस तरह के कोई समाधान नहीं है। उन्हें पढ़ना मुझे लगता है कि अगर कोई एआरएम के लिए संकलन करना चाहता है तो कर्नेल के अंदर किसी को 64 बिट डिवीजन नहीं करना चाहिए?

उत्तर

11

अधिकांश 32-बिट CPUs पर, धीमी लाइब्रेरी फ़ंक्शन के साथ 64-बिट विभाजन लागू किया जाना चाहिए। संकलक को अनजाने में धीमा कोड उत्पन्न करने से रोकने के लिए, लिनक्स इन कार्यों को लागू नहीं करता है।

यदि आप 64-बिट डिवीजन करना चाहते हैं, तो आपको उन्हें स्पष्ट रूप से करना होगा। <asm/div64.h> सेका उपयोग करें।

+0

HI! और मॉड्यूलो कैसे बनाना है? – flav

+3

@flav एक प्रश्न पूछने के लिए, "प्रश्न पूछें" बटन का उपयोग करें। या इसके बजाय [प्रलेखन] पढ़ें (http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/asm-generic/div64.h) पहले। –

संबंधित मुद्दे