2016-01-23 3 views
20

gcc के साथ सी (या एएसएम) में एक हैलो-वर्ल्ड-जैसे प्रोग्राम को लिंक करते समय यह परिणाम निष्पादन योग्य ऑब्जेक्ट फ़ाइल में कुछ सामान जोड़ देगा। मुझे केवल रनटाइम डायनामिक लिंकर और _start एंट्री पॉइंट के बारे में पता है लेकिन इन अतिरिक्त कार्यों में से किस प्रकार का है?जीएनसी लिनक्स ईएलएफ में क्या कार्य करता है?

00000000004003f0 t deregister_tm_clones 
0000000000400430 t register_tm_clones 
0000000000400470 t __do_global_dtors_aux 
0000000000400490 t frame_dummy 
00000000004004e0 T __libc_csu_init 
0000000000400550 T __libc_csu_fini 
0000000000400554 T _fini 
0000000000600668 t __frame_dummy_init_array_entry 
0000000000600668 t __init_array_start 
0000000000600670 t __do_global_dtors_aux_fini_array_entry 
0000000000600670 t __init_array_end 

वे क्या हैं और किसके लिए? क्या यह कहीं वर्णित है? गुगलिंग मदद नहीं करता है।

+6

सी [लिनक्स x86 कार्यक्रम प्रारंभ ऊपर पैट्रिक होर्गन द्वारा] (http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html) नोट libc बिना कि शुद्ध एएसएम कोड इन नहीं जोड़ता है, क्योंकि वे libc से आते हैं। – Jester

+0

@ जेस्टर बहुत अच्छा लग रहा है, धन्यवाद! यदि इसमें कोई चीज है जो मैंने पूछा है तो आप इस जानकारी के साथ जवाब दे सकते हैं (निश्चित रूप से वहां से कुछ जानकारी के साथ)। –

उत्तर

20

इनमें से अधिकतर "मुख्य" कार्यक्रम से पहले या बाद में कोड निष्पादित करने के लिए विभिन्न विधियां हैं और अधिकांश 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 (चिह्नित 'टी') नहीं हैं।

+0

क्या आप 'ग्लोबल डिस्ट्रक्टर्स' 'प्रोग्राम-स्तरीय प्रारंभकर्ताओं और फाइनलाइजर्स' के बारे में स्पष्ट करने के लिए कुछ जोड़ सकते हैं, कृपया? इससे जवाब मेरी राय में और अधिक समाप्त हो जाएगा। –

+1

प्रति * साझा * ऑब्जेक्ट फ़ाइल, प्रति ऑब्जेक्ट फ़ाइल नहीं। – o11c

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