26

मैं अपने इंटेल x86 होस्ट पर एआरएम आर्किटेक्चर के लिए एक helloworld कर्नेल (2.6.x) मॉड्यूल संकलित करने की कोशिश कर रहा हूं।कर्नेल मॉड्यूल को संकलित करना

एआरएम के लिए codesourcery उपकरण श्रृंखला पर स्थित है: /घर/रवि/कार्यक्षेत्र/बाज़/हाथ-2009q3

गिरी स्रोत पर स्थित है: /घर/रवि/कार्यक्षेत्र/बाज़/लिनक्स -omapl1

मेरे Makefile:

ARCH=arm 
CROSS_COMPILE=arm-none-linux-gnueabi 
obj-m := Hello.o 
KDIR := /home/ravi/workspace/hawk/linux-omapl1 
PWD := $(shell pwd) 
default: 
      $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 
clean: 
      $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean 

जब मैं बनाने के चलाने के लिए, .ko उत्पादित मेरी होस्ट मशीन का है जो टी का मतलब वह मेकफ़ाइल क्रॉस कंपाइलर के बजाय मूल कंपाइलर का आह्वान कर रहा है। मैं क्या गलत कर रहा हूं? क्रॉस कंपाइलर की बाइनरी मेरे रास्ते में हैं।

+0

क्या हम मेकफ़ाइल को 'केडीआईआर' से देख सकते हैं? – Beta

उत्तर

29

मेकफ़ाइल में ARCH और CROSS_COMPILE डालकर काम नहीं करता है। आप कमांड लाइन पर डाल की जरूरत है:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 
+1

एक तरफ नोट पर, क्या हम जीसीसी स्विच का उपयोग करके मेकफ़ाइल लिखने के बिना मॉड्यूल संकलित कर सकते हैं? – itisravi

+2

मुझे यकीन है कि आप कर सकते हैं, लेकिन यह आसान नहीं होगा। अपनी कमांडलाइन में 'वी = 1' जोड़ें जब आप कॉल करते हैं कि जीसीसी को कैसे कहा जाता है। यही है कि आपको 'बनाने के बजाय टाइप करना होगा ...' – JayM

+3

किसी भी तरह लिनक्स नोब के रूप में मुझे आश्चर्य है कि ARCH और CROSS_COMPILE कुछ मेकफ़ाइल में क्यों हैं यदि वे इस तरह से काम नहीं करते हैं। – Patric

6

Sidenote: SUBDIRS=M= के पक्ष में पदावनत किया गया है।

-2
MODULES := hola_kern.o 

#guest architecture 
ARCH := arm 

CROSS_COMPILE := arm-linux-gnueabi- 
obj-m := $(MODULES) 

#path of the arm compiled kernel 
ROOTDIR := /home/aldo/c/proyectos/prefixa/work/kernels/linux-omap-5f0a6e2 

MAKEARCH := $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) 

all: modules 
modules: 
    $(MAKEARCH) -C $(ROOTDIR) M=${shell pwd} modules 

clean: 
    $(MAKEARCH) -C $(ROOTDIR) M=${shell pwd} clean 
17

बदलें

ARCH = हाथ
CROSS_COMPILE = हाथ-नन-linux-gnueabi

निर्यात ARCH द्वारा: = हाथ
निर्यात CROSS_COMPILE : = arm-none-linux-gnueabi-

यह भी काम करेगा यदि आप इन पैरामीटर कमांड लाइन को हर बार नहीं देना चाहते हैं।

5

आप की कोशिश कर सकते, तो आप डिफ़ॉल्ट में ARCH और CROSS_COMPILE जोड़ने के लिए भूल गया और अपने Makefile चर घोषणाओं के अंत में साफ

ARCH=arm 
COMPILER=arm-none-linux-gnueabi 
obj-m := Hello.o 
KERNELDIR := /home/ravi/workspace/hawk/linux-omapl1 
PWD := $(shell pwd) 
default: 
    $(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(COMPILER) modules 

clean: 
    $(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) clean 
+0

यह एक अच्छा जवाब है लेकिन यहां एक टाइपो है। केडीआईआर और केर्नेलर को एक ही वैरिएबल नाम होना चाहिए। – Samuel

+0

@ सैमुअल की टिप्पणियां '$ CROSS_COMPILE' /' $ CROSS' पर भी लागू होती हैं, मुझे विश्वास है कि –

+0

आप डैश चूक गए हैं और आप 'COMPILER' के बजाय' CROSS_COMPILE' का उपयोग कर सकते हैं। – 0andriy

0

जोड़ने export उन्हें subshells उपलब्ध कराएंगे। और CROSS_COMPILE उपसर्ग को JayM के रूप में SUBDIRSuser502515 के रूप में M पर डैश जोड़ें।

और मेकफ़ाइल में = के बजाय := का उपयोग करना आम तौर पर एक अच्छा विचार है, इसलिए चर केवल एक बार इंटरपोलेट हो जाता है। हालांकि इस विशेष मामले में वास्तव में कोई फर्क नहीं पड़ता।

ARCH := arm 
CROSS_COMPILE := arm-none-linux-gnueabi- 
obj-m := Hello.o 
KDIR := /home/ravi/workspace/hawk/linux-omapl1 
PWD := $(shell pwd) 
export 
default: 
      $(MAKE) -C $(KDIR) M=$(PWD) modules 
clean: 
      $(MAKE) -C $(KDIR) M=$(PWD) clean