मैं कॉलेज में कक्षा के लिए NASM
के साथ असेंबली सीख रहा हूं। मैं ld
साथ सी रनटाइम लाइब्रेरी लिंक करना चाहते हैं, लेकिन मैं सिर्फ यह आसपास मेरे सिर लपेटो नहीं कर पा रहे। मेरे पास स्थापित 64 bit
मशीन है।सी रनटाइम लाइब्रेरी को 'एलडी' से कैसे लिंक करें?
कारण मैं उलझन में हूं कि - मेरे ज्ञान के लिए - सी रनटाइम को जोड़ने के बजाय, gcc
आपके प्रोग्राम में आवश्यक चीजों की प्रतिलिपि बनाता है। हालांकि मैं गलत हो सकता हूं, इसलिए कृपया मुझे इस पर सही करने में संकोच न करें।
क्या मैं ऊपर किया था करने के लिए इस बिंदु है, यह gcc
का उपयोग कर से जोड़ने के लिए। यह एक मशीन कोड की गड़बड़ी पैदा करता है जिसे मैं पालन करने में असमर्थ हूं, यहां तक कि rax
को rbx
के साथ स्वैपिंग जैसे छोटे कार्यक्रम के लिए, जो सीखने के उद्देश्यों के लिए बहुत अच्छा नहीं है। (कृपया ध्यान दें कि कार्यक्रम काम करता है।)
मैं अगर यह प्रासंगिक है यकीन नहीं है, लेकिन इन आदेशों को मैं संकलित करने के लिए उपयोग कर रहा हूँ और कड़ी कर रहे हैं:
# compilation
nasm -f elf64 swap.asm
# gcc
gcc -o swap swap.o
# ld, no c runtime
ld -s -o swap swap.o
अग्रिम धन्यवाद!
निष्कर्ष:
अब जब कि मैं प्रश्न के लिए एक उचित जवाब है, यहाँ कुछ चीजें हैं जो मैं उल्लेख करना चाहते हैं कर रहे हैं। glibc
को जोड़ने से जेड बोसन के उत्तर (64 बिट सिस्टम के लिए) की तरह गतिशील रूप से किया जा सकता है। आप इसे स्थिर (जेड बोसॉन के जवाब से है कि मैं कर रहा हूँ फिर से पोस्टिंग) do follow this link क्या करना चाहते हैं, तो।
यहां एक लेख है कि जेस्टर पोस्ट किया गया, लगभग how programs start in linux।
यह देखने के लिए कि gcc
आपके .o
-s को लिंक करने के लिए करता है, इस आदेश को आजमाएं: gcc -v -o swap swap.o
। ध्यान दें कि 'v' 'verbose' के लिए खड़ा है।
इसके अलावा, you should read this अगर आप 64 बिट विधानसभा में रुचि रखते हैं।
अपने जवाब और उपयोगी जानकारी के लिए धन्यवादआप! भाषण का अंत
संक्षिप्त उत्तर: नहीं। दुर्भाग्य से libc न केवल गतिशील पुस्तकालय के साथ आता है, लेकिन प्रारंभिक वस्तुओं और शट डाउन के लिए आवश्यक स्थिर वस्तुओं का एक गुच्छा। यदि आप वास्तव में ऐसा करना चाहते हैं, तो यह देखने के लिए कि आवश्यक भाग क्या हैं, 'gcc -v' का उपयोग करें। आपको इस कार्यक्रम में रुचि हो सकती है [प्रोग्राम स्टार्टअप के बारे में शानदार लेख] (http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html)। – Jester
'gcc -o swap swap.o' रनटाइम को लिंक करता है। 'ld -o स्वैप swap.o' नहीं करता है। लिंकिंग में रनटाइम के बड़े-आइस हिस्सों को निष्पादन योग्य पर कॉपी करना शामिल है। वास्तव में समस्या क्या है? –
@ जेस्टर मैं अभी उसमें देख लूंगा! – mrDudePerson