उदाहरण:आउटपुट objdump -t के आउटपुट में ".hidden" का क्या अर्थ है?
$ objdump Logger.cpp.o -t
00000000 g F .text 00000000 .hidden __sti___10_Logger_cpp_0b2ae32b
उदाहरण:आउटपुट objdump -t के आउटपुट में ".hidden" का क्या अर्थ है?
$ objdump Logger.cpp.o -t
00000000 g F .text 00000000 .hidden __sti___10_Logger_cpp_0b2ae32b
इसका मतलब है कि प्रतीक की दृश्यता छिपा हुआ है: प्रतीकों की दृश्यता को बदलने के लिए https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html
कारणों में शामिल हैं: प्रतीक टक्कर के
अधिक जानकारी के लिए http://www.gnu.org/software/gnulib/manual/html_node/Exported-Symbols-of-Shared-Libraries.html देखें।
एक लिंक है कि (जीसीसी के लिए) visibility support बताते
लिंक से:
यह काफी हद तक अपने DSO (गतिशील शेयर्ड ऑब्जेक्ट) का लोड समय में सुधार। उदाहरण के लिए, एक विशाल सी ++ टेम्पलेट-आधारित लाइब्रेरी जिसे परीक्षण किया गया था (टीएनएफओएक्स बूस्ट। पायथन बाइंडिंग लाइब्रेरी) अब छह मिनट से अधिक आठ सेकंड में लोड हो जाता है!
यह ऑप्टिमाइज़र बेहतर कोड उत्पन्न करने देता है। पीएलटी संकेत (जब एक फ़ंक्शन कॉल या वैरिएबल एक्सेस को वैश्विक ऑफसेट टेबल जैसे पीआईसी कोड में देखा जाना चाहिए) को पूरी तरह से टाला जा सकता है, इस प्रकार आधुनिक प्रोसेसर पर पाइपलाइन स्टालों से काफी हद तक बचा जा सकता है और इस प्रकार बहुत तेज़ कोड। इसके अलावा जब अधिकांश प्रतीकों को स्थानीय रूप से बाध्य किया जाता है, तो उन्हें पूरे डीएसओ के माध्यम से सुरक्षित रूप से elided (हटाया जा सकता है)। यह विशेष रूप से इनलाइनर के लिए अधिक अक्षांश देता है जिसे अब "बस मामले में" के आसपास एक प्रविष्टि बिंदु रखने की आवश्यकता नहीं है।
यह आपके डीएसओ के आकार को 5-20% तक कम कर देता है। ईएलएफ का निर्यात किया गया प्रतीक तालिका प्रारूप काफी अंतरिक्ष हॉग है, जो पूरे मैंगलेड प्रतीक नाम को देता है जिसमें भारी टेम्पलेट उपयोग लगभग 1000 बाइट्स औसत हो सकता है। सी ++ टेम्पलेट्स प्रतीकों की एक बड़ी राशि निकालते हैं और एक सामान्य सी ++ लाइब्रेरी आसानी से 30,000 प्रतीकों को पार कर सकती है जो लगभग 5-6 एमबी है! इसलिए यदि आप 60-80% अनावश्यक प्रतीकों काटते हैं, तो आपका डीएसओ मेगाबाइट छोटा हो सकता है!
प्रतीक टकराव का बहुत कम मौका। अलग-अलग चीजों के लिए आंतरिक रूप से एक ही प्रतीक का उपयोग करते हुए दो पुस्तकालयों की पुरानी दुविधा अंततः इस पैच के साथ हमारे पीछे है। हलिलुय!
हालांकि पुस्तकालय ऊपर उद्धृत एक चरम मामला है, नए दृश्यता समर्थन> 200,000 प्रतीकों से कम से कम 18,000 को निर्यात प्रतीक तालिका कम कर दिया। कुछ 21 एमबी बाइनरी आकार से भी खटखटाया गया था!
एक usage sample and also potential pitfall जब visibilty विशेषता का उपयोग
मैं स्थिर मेरी निष्पादन से जोड़ने के लिए लाइब्रेरी का उपयोग कर रहा हूँ। समस्या यह है कि मेरे पास उपरोक्त प्रतीक दो अलग-अलग libs में परिभाषित किया गया है, दोनों छिपे हुए हैं। डुप्लिकेट प्रतीकों के कारण लिंकिंग विफल हो जाती है। जब मैं आपको सही ढंग से समझता हूं, ऐसा नहीं होना चाहिए, क्या यह चाहिए? – MBober
@MBober: नहीं, लिंकर के लिए उस परिदृश्य में त्रुटि उत्पन्न करना सही है। ध्यान रखें कि स्थैतिक पुस्तकालय मूल रूप से ऑब्जेक्ट फ़ाइलों का एक संग्रह है जो स्थिर लाइब्रेरी में लिंक होने पर लिंकर में इनपुट बन जाता है। प्रतीक दृश्यता लिंकर (निष्पादन योग्य या गतिशील लाइब्रेरी) के आउटपुट को प्रभावित करती है, लेकिन आपके पास अभी भी लिंकर होगा यदि दो या दो से अधिक ऑब्जेक्ट फ़ाइलें समान प्रतीक परिभाषित करती हैं तो समस्याएं। –