"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > स्थिर रूप से pthread को g++ के साथ जोड़ने से सेगमेंटेशन दोष क्यों होता है, और मैं `--संपूर्ण-संग्रह` विकल्प का उपयोग करके इसे कैसे हल कर सकता हूं?

स्थिर रूप से pthread को g++ के साथ जोड़ने से सेगमेंटेशन दोष क्यों होता है, और मैं `--संपूर्ण-संग्रह` विकल्प का उपयोग करके इसे कैसे हल कर सकता हूं?

2024-11-15 को प्रकाशित
ब्राउज़ करें:741

Why does statically linking pthread with g   lead to a segmentation fault, and how can I resolve it using the `--whole-archive` option?

जब g स्थिर रूप से pthread को लिंक करता है, जिससे सेगमेंटेशन दोष होता है, तो क्यों?

स्थैतिक लिंकिंग में, लिंकर पहले प्रतीक पर ही रुक जाएगा, यहां तक ​​कि यदि वह कमजोर है, और मजबूत की तलाश करना बंद कर देता है। इसे सभी प्रतीकों को देखने के लिए मजबूर करने के लिए (जैसा कि यह गतिशील रूप से लिंक की गई लाइब्रेरी के लिए होता), ld - संपूर्ण-संग्रह विकल्प का समर्थन करता है।

निम्न आदेश काम करेगा:

g   -o one one.cpp -Wall -std=c  11 -O3 -static -pthread \
    -Wl,--whole-archive -lpthread -Wl,--no-whole-archive

यहां क्या हो रहा है:

  • -pthread का अर्थ है pthread के विरुद्ध लिंक करना (और इस पर निर्भर करता है) प्लेटफ़ॉर्म, यह -D_REENTRANT) जैसे अतिरिक्त मैक्रोज़ को परिभाषित करता है)। संपूर्ण-संग्रह आवश्यक ऑब्जेक्ट फ़ाइलों के लिए संग्रह की खोज करने के बजाय, लिंकर को संग्रह में प्रत्येक ऑब्जेक्ट फ़ाइल को लिंक में शामिल करने के लिए बाध्य करता है।
  • Wl,--no-संपूर्ण-संग्रह के प्रभाव को बंद कर देता है --बाद की संग्रह फ़ाइलों के लिए संपूर्ण-संग्रह विकल्प।
  • कमजोर प्रतीकों को समझना

ईएलएफ फ़ाइल प्रारूप में कमजोर और मजबूत प्रतीकों की अवधारणा है। डिफ़ॉल्ट रूप से, किसी ऑब्जेक्ट फ़ाइल में प्रतीक मजबूत होते हैं। लिंकिंग के दौरान, एक मजबूत प्रतीक उसी नाम के कमजोर प्रतीक को ओवरराइड कर सकता है।ग्लिबैक और पाथ्रेड्स के मामले में, वे कमजोर प्रतीकों का उपयोग करते हैं। उदाहरण के लिए, POSIX द्वारा fputc को थ्रेड-सुरक्षित होना आवश्यक है और इसे सिंक्रनाइज़ करने की आवश्यकता है, जो महंगा है। एकल-थ्रेडेड वातावरण में, आप इन लागतों का भुगतान नहीं करना चाहते हैं। इसलिए एक कार्यान्वयन सिंक्रोनाइज़ेशन फ़ंक्शंस को खाली स्टब्स के रूप में कार्यान्वित कर सकता है, और फ़ंक्शंस को कमजोर प्रतीकों के रूप में घोषित कर सकता है। यह नियत नहीं था। मल्टी-थ्रेडिंग लाइब्रेरी को लिंक करते समय, लिंकर स्टब्स को वास्तविक सिंक्रोनाइज़ेशन फ़ंक्शंस (मजबूत प्रतीकों के रूप में परिभाषित और थ्रेडिंग-लाइब्रेरी द्वारा कार्यान्वित) द्वारा प्रतिस्थापित कर सकता है।

इसे उदाहरण प्रोग्राम पर लागू करना

Libc.a लाइब्रेरी में __pthread_mutex_lock एक कमजोर प्रतीक के रूप में है, और libpthread.a लाइब्रेरी में यह एक मजबूत प्रतीक के रूप में है। गतिशील रूप से लिंक करते समय, लिंकर कमजोर प्रतीक को मजबूत प्रतीक से बदल देता है। हालाँकि, स्थिर रूप से लिंक करते समय, आपको उसी शब्दार्थ को लागू करने की आवश्यकता होती है। इसीलिए -Wl,--संपूर्ण-संग्रह -lpthread -Wl,--संपूर्ण-संग्रह की आवश्यकता नहीं है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3