2013-08-06 4 views
6

मुझे यह जानना अच्छा लगता है कि कार्यक्रम कैसे काम करते हैं ताकि इसे यथासंभव नंगे हड्डियों के रूप में बनाया जा सके, मैं असेंबली के साथ मूर्खतापूर्ण हूं।crt1.o crti.o और crtn.o से जुड़े होने पर एक असेंबली प्रोग्राम केवल तभी काम करता है?

मुझे पता चला कि wprintf फ़ंक्शन का उपयोग करके x86_64 के लिए कोड कैसे इकट्ठा करना है (विस्तृत वर्ण 32 बिट हैं)। मुझे बस libc (-lc) से लिंक करना था।

मैं एक ही चीज़ के बारे में 32-बिट करने के लिए कोड इकट्ठा करने की कोशिश कर रहा हूं लेकिन मैं काफी हद तक ठोकर खा रहा हूं। आखिरकार मैंने लिंक करने के लिए जीसीसी का इस्तेमाल किया (और _start: main में बदल दिया :)। तो फिर मैंने एलडी का उपयोग करके खुद को जोड़ने और crt1.o crti.o और crtn.o शामिल किया। फिर मेरे कार्यक्रम ने काम किया (यह पहले कुछ भी प्रिंट नहीं करेगा) तो मेरा सवाल यह है कि, क्या मैं इन अन्य 3 ऑब्जेक्ट फ़ाइलों की आवश्यकता को खत्म करने के लिए अपने कोड में कुछ कर सकता हूं (और निश्चित रूप से वापस लौटाएं: मुख्य के बजाय :) ?

test_lib.S

.section .data 
locale: 
    .string "" 
    .align 4 
printformat: 
    .long '%','l','c',0 

.section .text 
.global main 
main: 

pushl $locale 
pushl $6 
call setlocale 
pushl $12414 
pushl $printformat 
call wprintf 
pushl $2 
call exit 

और चल निम्नलिखित

as --32 test_lib.S -o test_lib.o 
ld -m elf_i386 -L/lib/ -L/usr/lib/ -I/lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -lc /usr/lib/crtn.o test_lib.o -o test_lib 
./test_lib 

ओह और आउटपुट बस एक जापानी हीरागाना (मा) ま है (नोटिस वहाँ कोई लाइन ब्रेक है तो यह प्रिंट प्रॉम्प्ट से पहले)

+0

http://stackoverflow.com/questions/3577922/how-to-link-a-gas-assembly-file-as-ac-program-with-ld-without-using-gcc –

उत्तर

8

यहां आपके लिए फाइलें क्या हैं। वे सी-रनटाइम पर्यावरण और सेटअप हैं जो ओएस से लिंक हैं।

crt1.o प्रारंभिक रनटाइम कोड की नई शैली। _start प्रतीक शामिल है जो libc मुख्य पर कूदने से पहले argc/argv/libc _init/libc _fini के साथ env सेट करता है। glibc इस फ़ाइल को 'स्टार्ट' कहते हैं।

crti.o फ़ंक्शन प्रोलॉग को परिभाषित करता है; .init खंड में _init अनुभाग में _init। glibc इस 'initfini.c' कहते हैं।

crtn.o फ़ंक्शन एपिलॉग परिभाषित करता है। glibc इस 'initfini.c' कहते हैं।

ऊपर दिए गए प्रत्येक पुस्तकालय के लिए निम्नलिखित वेबसाइट http://wiki.osdev.org/Creating_a_C_Library पर एक उत्कृष्ट लेखन और उदाहरण कोड पाया जा सकता है।

+0

अच्छी तरह से आपका लिंक मुझे जो कुछ याद आ रहा है, दिखाता है। दुर्भाग्यवश यह x86_64 के कॉलिंग सम्मेलनों पर आधारित है। मुझे आश्चर्य है कि 32-बिट प्रोग्राम में argc और argv कहां होना चाहिए। इसके अलावा, मेरे 64 बिट प्रोग्राम को इन फ़ाइलों की आवश्यकता क्यों नहीं थी, लेकिन मेरे 32 बिट ने क्या किया? – Craig

+0

मुझे लगता है कि 32 बनाम 64 लिंकर अलग-अलग डिफ़ॉल्ट खींच रहे हैं लेकिन मुझे यकीन नहीं है। मुझे टूलचेन्स में लिंकर्स के बीच अंतर का सामना करना पड़ा है। –

+0

libc के बिना संकलन (http://stackoverflow.com/questions/2548486/compiling-without-libc) में अतिरिक्त अच्छी जानकारी है। –

0

3-बिट लिनक्स में, वे ढेर पर हैं। शुरूआत में, 0 (% esp) में argc शामिल है। 4 (% esp) पर, आपको प्रोग्राम नाम के लिए एक सूचक मिलेगा (जिसे argc में शामिल किया गया है)। इसके बाद तर्कों के लिए पॉइंटर्स की एक सरणी आती है, जो एक पूर्ण सूचक के साथ निष्कर्ष निकाला जाता है। इसके बाद सिस्टम चर के लिए पॉइंटर्स की एक और पूर्ण-निष्कर्ष निकाली आती है। मुझे बताया गया है कि उनमें से 200 से अधिक हो सकते हैं !!

Shiarta

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