इनमें से अधिकतर "मुख्य" कार्यक्रम से पहले या बाद में कोड निष्पादित करने के लिए विभिन्न विधियां हैं और अधिकांश crtstuff.c
(https://github.com/gcc-mirror/gcc/blob/master/libgcc/crtstuff.c) में रहते हैं। वे विभिन्न सी-जैसी प्रोग्रामिंग भाषाओं की सुविधाओं का समर्थन करने के लिए मौजूद हैं, लेकिन उन्हें सी में भी पहुंचा जा सकता है। यह शायद जटिल पर प्रतीत होता है क्योंकि इनमें से कुछ विरासत सामान का प्रतिनिधित्व करते हैं और कुछ अलग-अलग आर्किटेक्चर का समर्थन करने के लिए आवश्यक भिन्नता जो जीसीसी चलती है।
अपनी सूची से, एक (या दो दो से) के बाद एक:
00000000004003f0 t deregister_tm_clones
0000000000400430 t register_tm_clones
लेन-देन की स्मृति धागे सरल के साथ प्रोग्रामिंग बनाने के लिए करना है। यह लॉक-आधारित सिंक्रनाइज़ेशन का एक विकल्प है। ये दिनचर्या लाइब्रेरी (libitm) द्वारा उपयोग की जाने वाली एक तालिका क्रमशः फाड़ें और सेटअप करें, जो इन कार्यों का समर्थन करती हैं। टीएम पर अधिक जानकारी यहाँ https://gcc.gnu.org/wiki/TransactionalMemory और यहाँ http://pmarlier.free.fr/gcc-tm-tut.html
0000000000400470 t __do_global_dtors_aux
सिस्टम पर कार्यक्रम है जहाँ .fini_array
उपलब्ध नहीं है से बाहर निकलने पर सभी वैश्विक विनाशकर्ता चलाता है।
0000000000400490 t frame_dummy
इस समारोह .init
अनुभाग में रहती है। इसे void frame_dummy (void)
के रूप में परिभाषित किया गया है और जीवन में इसका पूरा बिंदु __register_frame_info_bases
पर कॉल करना है जिसमें तर्क हैं। स्पष्ट रूप से .init
अनुभाग से तर्कों के साथ कार्यों को कॉल करने के लिए अविश्वसनीय हो सकता है, इसलिए यह कार्य __register_frame_info_bases
सीधे .init section
से नहीं कहा जाता है। .eh_frame
जानकारी बेस का उपयोग अपवाद हैंडलिंग और इसी तरह की विशेषताओं के लिए किया जाता है (उदा। __attribute__((cleanup(..)))
के साथ घोषित फ़ंक्शंस)।
00000000004004e0 T __libc_csu_init
0000000000400550 T __libc_csu_fini
इन चलाने किसी भी कार्यक्रम स्तरीय initializers और (अपने पूरे कार्यक्रम के लिए एक तरह से कंस्ट्रक्टर्स/विनाशकर्ता की तरह) finalizers। तुम जैसे कार्यों को परिभाषित हैं:
void __attribute__ ((constructor)) mefirst() {
/* ... do something here ... */
}
void __attribute__ ((destructor)) melast() {
/* ... do something here ... */
}
वे पहले और इन दिनचर्या द्वारा क्रमशः main()
के बाद बुलाया जाएगा। भी https://gcc.gnu.org/onlinedocs/gccint/Initialization.html
0000000000400554 T _fini
देखें यह एक कार्यक्रम स्तर (वस्तु फ़ाइल स्तर वास्तव में) नाशक (इस पर एक छोटे से जानकारी man dlclose
में पाया जा सकता) को चलाने के लिए एक अब पदावनत तरीका है। रचनाकारों के लिए इसी अप्रचलित कार्य __init
है।
0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start
ये अंत और .init_array
खंड है, जो सभी कार्यक्रम स्तरीय initializers की ओर इशारा होता है की शुरुआत का प्रतीक (ऊपर __libc_csu_init देखें)।
0000000000600670 t __do_global_dtors_aux_fini_array_entry
0000000000600670 t __init_array_end
ये अंत चिह्नित करने और (देखें __libc_csu_fini ऊपर) .fini_array
खंड है, जो सभी कार्यक्रम स्तरीय finalizers की ओर इशारा होता है की शुरू करते हैं।
[संपादित करें] कुछ अतिरिक्त नोट्स:
लिंक http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html जेस्टर के सवाल टिप्पणी से एक अच्छा चित्र और एक छोटा सा नमूना कार्यक्रम समग्र इन illustrating शामिल सी
से इन सुविधाओं में से कुछ तक पहुंचने के लिए चीजें कैसे चलती हैं
शर्तों 'ctors' और 'dtors' 'कंस्ट्रक्टर्स' और 'विनाशकर्ता' क्रमशः के लिए संक्षिप्त कर रहे हैं।
वैश्विक रचनाकार/विनाशकों और ऑब्जेक्ट-फ़ाइल रचनाकारों/विनाशकों के बीच का अंतर सबसे स्पष्ट है जब आपका प्रोग्राम एकाधिक ऑब्जेक्ट फ़ाइलों से बनाया गया है।
प्रतीकों चिह्नित 'टी' (__libc_csu_init, __libc_csu_fini, _fini) "वैश्विक" (बाहर से दिखाई देने) कर रहे हैं, remainer (चिह्नित 'टी') नहीं हैं।
सी [लिनक्स x86 कार्यक्रम प्रारंभ ऊपर पैट्रिक होर्गन द्वारा] (http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html) नोट libc बिना कि शुद्ध एएसएम कोड इन नहीं जोड़ता है, क्योंकि वे libc से आते हैं। – Jester
@ जेस्टर बहुत अच्छा लग रहा है, धन्यवाद! यदि इसमें कोई चीज है जो मैंने पूछा है तो आप इस जानकारी के साथ जवाब दे सकते हैं (निश्चित रूप से वहां से कुछ जानकारी के साथ)। –