2016-09-27 2 views
5

हम जानते हैं, विधानसभा फ़ाइलें (एस) कोडांतरण से पहले पूर्व प्रसंस्करण मिल जाएगा, लेकिन मैंने पाया कि बाद preprocessing वहाँ जिसके परिणामस्वरूप विधानसभा फाइलों में struct किया जा सकता है/समारोह प्रोटोटाइप, कैसे होगा ये प्रोटोटाइप के साथ सौदा के रूप में जीएनयू? बस इसे नजरअंदाज कर दिया?असेंबली फ़ाइल (.s) में प्रक्रिया संरचना और फ़ंक्शन प्रोटोटाइप के रूप में जीएनयू कर सकते हैं?

उदाहरण के लिए, निम्न आदेश:

gcc -E -o tmp.result arch/x86/boot/copy.S -Iinclude/ -Iarch/x86/include/

और जिसके परिणामस्वरूप विधानसभा फ़ाइल (tmp.result) है:

as -o tmp.o tmp.result

:

# 1 "arch/x86/boot/copy.S"                                         
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "arch/x86/boot/copy.S" 
# 11 "arch/x86/boot/copy.S" 
# 1 "include/linux/linkage.h" 1 
# 1 "include/linux/compiler.h" 1 
# 5 "include/linux/linkage.h" 2 
# 1 "include/linux/stringify.h" 1 
# 6 "include/linux/linkage.h" 2 
# 1 "include/linux/export.h" 1 
# 26 "include/linux/export.h" 
struct kernel_symbol 
{ 
unsigned long value; 
const char *name; 
}; 
# 7 "include/linux/linkage.h" 2 
# 1 "arch/x86/include/asm/linkage.h" 1 
# 8 "include/linux/linkage.h" 2 
# 12 "arch/x86/boot/copy.S" 2 
.code16 
.text 
GLOBAL(memcpy) 
pushw %si 
pushw %di 
movw %ax, %di 
movw %dx, %si 
pushw %cx 
shrw $2, %cx 
rep; movsl 
popw %cx 
andw $3, %cx 
rep; movsb 
popw %di 
popw %si 
retl 
ENDPROC(memcpy) 

लेकिन जब इस फाइल को इकट्ठा करने के लिए कोशिश कर रहा निम्न त्रुटि

उपज:

include/linux/export.h: Assembler messages: 
include/linux/export.h:26: Error: no such instruction: `struct kernel_symbol' 
include/linux/export.h:27: Error: junk at end of line, first unrecognized character is `{' 
include/linux/export.h:28: Error: no such instruction: `unsigned long value' 
include/linux/export.h:29: Error: no such instruction: `const char *name' 
include/linux/export.h:30: Error: junk at end of line, first unrecognized character is `}' 
arch/x86/boot/copy.S:20: Error: invalid character '(' in mnemonic 
arch/x86/boot/copy.S:34: Error: invalid character '(' in mnemonic 
arch/x86/boot/copy.S:36: Error: invalid character '(' in mnemonic 
arch/x86/boot/copy.S:49: Error: invalid character '(' in mnemonic 
arch/x86/boot/copy.S:51: Error: invalid character '(' in mnemonic 
arch/x86/boot/copy.S:58: Error: invalid character '(' in mnemonic 
arch/x86/boot/copy.S:60: Error: invalid character '(' in mnemonic 
arch/x86/boot/copy.S:67: Error: invalid character '(' in mnemonic 

ऐसा नहीं है कि कोडांतरक tmp.result में struct के साथ सौदा नहीं कर सकते लगता है। लिनक्स स्रोत कोड (एस) कैसे संयोजन के माध्यम से हो सकता है?

+0

क्या 'tmp.result' फ़ाइल के साथ therafter क्या होता है? 'Tmp.result' पर काम करने वाला अगला आदेश क्या है? – Downvoter

+0

@Downvoter tmp.result पर काम करने वाला अगला कमांड है: 'as -o tmp.o tmp.result', लेकिन यह त्रुटि उत्पन्न करता है, ने कहा कि यह tmp.result में संरचना को पहचान नहीं पाया है, इसलिए मैं सोचता हूं कि लिनक्स स्रोत कोड कैसे हो सकता है संयोजन के माध्यम से मिलता है। – Kingwah

+1

आप वास्तविक प्री-प्रोसेस की गई फ़ाइल को सहेजने के लिए 'gcc -save-temps' का उपयोग कर सकते हैं जो इसे असेंबलर को फ़ीड करता है। जैसा कि मैटेयो का जवाब बताता है, यह आपको 'gcc -E' के साथ प्राप्त होने से अलग होगा। आप सीपीपी को कैसे आमंत्रित करते हैं यह देखने के लिए आप 'gcc -v' का भी उपयोग कर सकते हैं। –

उत्तर

3

asstruct संसाधित नहीं कर सकता है और प्रोटोटाइप कार्य नहीं कर सकता - वे केवल सी कंपाइलर के लिए हैं, और गलती से आपके प्रीप्रोकैसिंग में "खींचा" प्राप्त करें।

#ifndef __ASSEMBLY__ 
struct kernel_symbol 
{ 
     unsigned long value; 
     const char *name; 
}; 

तो, ऊपर हैडर दोनों विधानसभा से और सी से शामिल होने के लिए सोचा है, लेकिन आप __ASSEMBLY__ को परिभाषित नहीं किया: तथ्यों में, आप शीर्ष लेख प्रावधान है कि struct परिभाषा you'll see देखो अगर यह बताने के लिए कि आप इसे एक असेंबली फ़ाइल में शामिल कर रहे हैं।

दिलचस्प है, जीसीसी एक विधानसभा फ़ाइल या एक सी फ़ाइल में एक शामिल किए जाने के बीच भेद करना अंतर्निहित __ASSEMBLER__ पूर्वनिर्धारित मैक्रो है, लेकिन यह है कि गिरी does not use it for historical reasons, मैन्युअल __ASSEMBLY__ को परिभाषित करने के लिए जब विधानसभा फ़ाइलों preprocessing पर बजाय भरोसा लगता है।

लांग लघु कहानी: पूर्वप्रक्रमक से सही उत्पादन प्राप्त करने के लिए, आप क्या करना चाहिए की तरह

gcc -E -D__ASSEMBLY__ -o tmp.result arch/x86/boot/copy.S -Iinclude/ -Iarch/x86/include/ 

(अस्वीकरण कुछ: मैं कर्नेल निर्माण प्रक्रिया के साथ पूरी तरह से परिचित नहीं हूँ, रेखा से ऊपर हो सकता है के साथ अन्य समस्याओं पथ, या शामिल हो सकता है सही तरीका cpp बजाय gcc या जो कुछ भी आह्वान करने के लिए हो सकता है - मैं नहीं जानता कि)

+1

विस्तार स्पष्टीकरण के लिए धन्यवाद। – Kingwah

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

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