मुझे यह जानना अच्छा लगता है कि कार्यक्रम कैसे काम करते हैं ताकि इसे यथासंभव नंगे हड्डियों के रूप में बनाया जा सके, मैं असेंबली के साथ मूर्खतापूर्ण हूं।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
ओह और आउटपुट बस एक जापानी हीरागाना (मा) ま है (नोटिस वहाँ कोई लाइन ब्रेक है तो यह प्रिंट प्रॉम्प्ट से पहले)
http://stackoverflow.com/questions/3577922/how-to-link-a-gas-assembly-file-as-ac-program-with-ld-without-using-gcc –