2011-01-14 11 views
6

क्या कुछ फ़ंक्शंस को चिह्नित करने के लिए जीसीसी और जीएनयू बिनुटिल्स के साथ कोई तरीका है जैसे कि वे उपयोग किए जाने पर लिंक-टाइम पर एक त्रुटि उत्पन्न करेंगे? मेरी स्थिति यह है कि मेरे पास कुछ लाइब्रेरी फ़ंक्शंस हैं जिन्हें मैं मौजूदा बाइनरी के साथ संगतता के लिए हटा नहीं रहा हूं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि कोई भी नई संकलित बाइनरी फ़ंक्शंस का उपयोग करने का प्रयास न करे। मैं केवल संकलन-समय जीसीसी विशेषताओं का उपयोग नहीं कर सकता क्योंकि अपमानजनक कोड मेरे शीर्षकों को अनदेखा कर रहा है और configure स्क्रिप्ट के साथ कार्यों की उपस्थिति का पता लगा रहा है और स्वयं को प्रोटोटाइप कर रहा है। मेरा लक्ष्य खराब configure स्क्रिप्ट के लिए एक लिंक-टाइम त्रुटि उत्पन्न करना है ताकि वे कार्यों के अस्तित्व का पता लगाना बंद कर सकें।बहिष्कृत कार्यों के लिए लिंक-टाइम त्रुटि उत्पन्न करना

संपादित करें: एक विचार .. विधानसभा का उपयोग कर गतिशील लिंकर के साथ संगत होना प्रवेश बिंदुओं के लिए गलत .type निर्दिष्ट लेकिन लिंक त्रुटियों उत्पन्न करने के लिए होगा, जब नए कार्यक्रमों से जोड़ने के लिए कोशिश कर रहा?

उत्तर

0

बहिष्कृत कार्यों के लिए लिंक-टाइम त्रुटि उत्पन्न करने का सबसे अच्छा तरीका है जिसे आप लोगों का उपयोग नहीं करना चाहते हैं यह सुनिश्चित करना है कि वंचित कार्य पुस्तकालयों में मौजूद नहीं हैं - जो उन्हें 'बहिष्कृत' से परे एक चरण बनाता है।

शायद आप इसमें सहायक कार्य के साथ सहायक पुस्तकालय प्रदान कर सकते हैं; जो लोग ध्यान नहीं देंगे वे सहायक पुस्तकालय से जुड़ सकते हैं, लेकिन मुख्यधारा के लोग सहायक लाइब्रेरी का उपयोग नहीं करेंगे और इसलिए कार्यों का उपयोग नहीं करेंगे। हालांकि, यह अभी भी इसे 'बहिष्कृत' चरण से परे ले जा रहा है।

लिंक-टाइम चेतावनी प्राप्त करना मुश्किल है। जाहिर है, जीसीसी कुछ फ़ंक्शन (mktemp() एट अल) के लिए करता है, और यदि आप gets() का उपयोग करने वाले प्रोग्राम को चलाते हैं तो ऐप्पल को GCC चेतावनी दी जाती है। मुझे नहीं पता कि ऐसा करने के लिए वे क्या करते हैं।


टिप्पणियों के प्रकाश में, मैं तुम्हें नहीं बल्कि कड़ी समय या चलाने के समय तक इंतजार कर से संकलन समय पर समस्या दूर सिर, की जरूरत है।

जीसीसी विशेषताओं में शामिल हैं (जीसीसी 4.4.1 मैनुअल से):

error ("message") 

यह विशेषता एक समारोह घोषणा और इस तरह के एक समारोह के लिए एक कॉल पर प्रयोग किया जाता है मृत कोड के माध्यम से समाप्त नहीं किया है उन्मूलन या अन्य अनुकूलन, एक त्रुटि जिसमें संदेश शामिल होगा, का निदान किया जाएगा। यह संकलन समय के लिए उपयोगी है, विशेष रूप से __builtin_constant_p और इनलाइन फ़ंक्शंस के साथ, जहां इनलाइन फ़ंक्शन तर्कों की जांच बाहरी char [(condition) के माध्यम से संभव नहीं है? 1 1]; चाल। हालांकि फ़ंक्शन को छोड़ना संभव है और इस प्रकार एक विशेषता विफलता का आह्वान करते समय, इस विशेषता का उपयोग करते समय समस्या का निदान किया जाएगा और कॉल के सटीक स्थान के साथ भी इनलाइन फ़ंक्शंस या डीबगिंग जानकारी को उत्सर्जित नहीं करते समय भी निदान किया जाएगा।

warning ("message") 

यह विशेषता एक समारोह घोषणा पर प्रयोग किया जाता है और इस तरह के एक समारोह के लिए एक कॉल मृत कोड उन्मूलन या अन्य अनुकूलन के माध्यम से समाप्त नहीं किया है, तो एक चेतावनी जो संदेश शामिल होंगे निदान किया जाएगा। यह संकलन समय के लिए उपयोगी है, विशेष रूप से __builtin_constant_p और इनलाइन फ़ंक्शंस के साथ। जबकि .gnu में किसी संदेश के साथ फ़ंक्शन को परिभाषित करना संभव है।चेतावनी * अनुभाग, इस विशेषता का उपयोग करते समय समस्या का निदान पहले और को इनलाइन फ़ंक्शंस की उपस्थिति में या डिबगिंग जानकारी उत्सर्जित करने पर भी कॉल के सटीक स्थान के साथ निदान किया जाएगा।

यदि कॉन्फ़िगरेशन प्रोग्राम त्रुटियों को अनदेखा करते हैं, तो वे बस टूटे हुए हैं। इसका मतलब है कि नए कोड को फ़ंक्शंस का उपयोग करके संकलित नहीं किया जा सकता है, लेकिन मौजूदा कोड पुस्तकालयों में बहिष्कृत कार्यों का उपयोग जारी रख सकता है (जब तक इसे पुन: संकलित करने की आवश्यकता न हो)।

+0

चेतावनी '.gnu.warning' नोट के साथ किया जा सकता है पर प्रतिबद्ध है, लेकिन मैं त्रुटियों को उत्पन्न करने के लिए समकक्ष नहीं जानता। दुर्भाग्यवश, जबकि आपका समाधान सबसे अच्छा है, यह एक बहिष्कृत एबीआई और नए अनुप्रयोगों को जोड़ने के लिए मेरी ज़रूरतों को पूरा नहीं करता है। –

+0

@ आर ..: पर्याप्त मेला। क्या यह कहना उचित है कि आप पुस्तकालयों की एक प्रति स्थापित करना चाहते हैं; आप चलाने के लिए जारी रखने के लिए पूर्व-संकलित ऐप्स (जो बहिष्कृत इंटरफ़ेस का उपयोग कर रहे हैं) चाहते हैं; आप नए संकलित ऐप्स चाहते हैं जो लिंक करने में विफल होने के लिए बहिष्कृत इंटरफ़ेस का उपयोग करते हैं? यदि ऐसा है, और यदि कॉन्फ़िगरेशन-डिटेक्टर बहिष्कृत कार्यों को खोजेंगे, तो आप लोगों को चीजों को ठीक करने की योजना कैसे बनाते हैं ताकि कोड आधुनिक (गैर-बहिष्कृत) इंटरफेस से जुड़ रहा हो? –

+0

कोई नया प्रतिस्थापन इंटरफ़ेस नहीं है; इन बहिष्कृत इंटरफेस का उपयोग करने की कोशिश करना सिर्फ हानिकारक है, और सही व्यवहार उनका उपयोग नहीं करना है।दुर्भाग्यवश मेरे पास टूटे हुए सॉफ़्टवेयर पर नियंत्रण नहीं है जो उनका उपयोग करने का प्रयास कर रहा है, और जब मैं संभवतः रखरखावकर्ताओं को नए संस्करणों को ठीक करने के लिए प्राप्त कर सकता हूं, तो उपयोगकर्ता अभी भी पुराने संस्करणों को संकलित करने की कोशिश कर रहे हैं। –

0

एक विचार स्टब लाइब्रेरी उत्पन्न करने के लिए हो सकता है जिसमें इन प्रतीकों हैं लेकिन अप्रत्याशित गुणों के साथ।

  • शायद वस्तुओं कार्यों के नाम पर है कि बनाने के लिए, तो विन्यास चरण में लिंकर शिकायत हो सकता है कि प्रतीकों संगत
  • कार्यों निर्भरता है "dont_use_symbol_XXX" कि
  • का समाधान कभी नहीं है कि पैदा नहीं कर रहे हैं
  • या नकली एक वैश्विक सूचकांक अपने कार्यों के लिए होता है कि लेकिन जहां संग्रह में ओ सदस्यों गलत प्रारूप करने के लिए
2

FreeBSD 9.x कुछ बहुत करीब से करता है कि आप क्या ttyslot() साथ चाहते हैं के साथ एक .a फ़ाइल समारोह tion। यह फ़ंक्शन utmpx के साथ व्यर्थ है। चाल यह है कि इस प्रतीक के केवल गैर-डिफ़ॉल्ट संस्करण हैं। इसलिए, ld इसे नहीं मिलेगा, लेकिन पुरानी बाइनरी चलाने पर आरटीएलडी संस्करण की परिभाषा पायेगी। मुझे नहीं पता कि क्या होता है यदि एक पुरानी बाइनरी का एक विचलित संदर्भ होता है, लेकिन संभवत: केवल एक परिभाषा है तो यह संभवतः समझदार है।

उदाहरण के लिए,

__asm__(".symver hidden_badfunc, [email protected]_1.0"); 

आम तौर पर, वहाँ भी एक डिफ़ॉल्ट संस्करण होगा,

__asm__(".symver new_badfunc, [email protected]@MYLIB_1.1"); 

या एक सोलारिस संगत संस्करण स्क्रिप्ट के माध्यम से की तरह है, लेकिन चाल एक जोड़ने के लिए नहीं है।

आमतौर पर, एएसएम निर्देश मैक्रो में लपेटा जाता है।

यह चाल .symver असेंबलर निर्देश के साथ प्रतीक संस्करणों को परिभाषित करने के लिए जीएनयू एक्सटेंशन पर निर्भर करती है, इसलिए यह शायद लिनक्स और फ्रीबीएसडी पर ही काम करेगी। सोलारिस-संगत संस्करण स्क्रिप्ट केवल प्रति प्रतीक एक परिभाषा व्यक्त कर सकती हैं।

अधिक जानकारी: .symverinfo gas में निर्देश, अलरिक ड्रेपपर के "कैसे साझा पुस्तकालयों लिखने के लिए", कि पदावनत ttyslot() http://gitorious.org/freebsd/freebsd/commit/3f59ed0d571ac62355fc2bde3edbfe9a4e722845

+0

क्या आप बेहतर तरीके से समझा सकते हैं कि यह कैसे काम करता है, या एक लिंक प्रदान करता है? ऐसा लगता है जैसे यह मेरी जरूरतों को पूरा कर सकता है। –

+0

@ आर .. मैंने एक संपादन में अधिक जानकारी जोड़ा। – jilles

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