ऑनवर्क्स लिनक्स और विंडोज ऑनलाइन वर्कस्टेशन

प्रतीक चिन्ह

वर्कस्टेशन के लिए मुफ्त होस्टिंग ऑनलाइन

<पिछला | विषय-सूची | अगला>

6.10. टूलचेन को समायोजित करना

अब जबकि अंतिम C लाइब्रेरीज़ स्थापित हो चुकी हैं, तो टूलचेन को समायोजित करने का समय आ गया है ताकि यह किसी भी नए संकलित प्रोग्राम को इन नई लाइब्रेरीज़ से जोड़ सके।

की छवि

/tools/bin/{ld,ld-पुराना}

/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}

/tools/bin/{ld-new,ld}

/tools/bin/{ld,ld-पुराना}

/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}

/tools/bin/{ld-new,ld}

सबसे पहले, बैकअप लें /औजार लिंकर को हटा दें, और इसे अध्याय 5 में बनाए गए समायोजित लिंकर से बदल दें। हम इसके समकक्ष के लिए एक लिंक भी बनाएंगे /tools/$(uname -m)-pc-linux-gnu/bin:


एमवी एमवी एमवी

ln

-v

-v

-v

एमवी एमवी एमवी

ln

-sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld

-sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld

इसके बाद, GCC स्पेक्स फ़ाइल को संशोधित करें ताकि यह नए डायनेमिक लिंकर की ओर इशारा करे। बस “/tools” के सभी इंस्टेंस को हटाने से हमें डायनेमिक लिंकर का सही पथ मिल जाना चाहिए। इसके अलावा स्पेक्स फ़ाइल को समायोजित करें ताकि GCC को पता हो कि सही हेडर और Glibc स्टार्ट फ़ाइल कहाँ मिलनी है। प्यास आदेश यह पूरा करता है:


gcc -dumpspecs | sed -e 's@/tools@@g' \

-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \

-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \

`dirname $(gcc --print-libgcc-file-name)`/specs

gcc -dumpspecs | sed -e 's@/tools@@g' \

-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \

-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \

`dirname $(gcc --print-libgcc-file-name)`/specs


यह सत्यापित करने के लिए कि इच्छित परिवर्तन वास्तव में किया गया था, स्पेक्स फ़ाइल का दृश्य निरीक्षण करना एक अच्छा विचार है।

इस बिंदु पर यह सुनिश्चित करना अनिवार्य है कि समायोजित टूलचेन के बुनियादी कार्य (संकलन और लिंकिंग) अपेक्षित रूप से काम कर रहे हैं। ऐसा करने के लिए, निम्नलिखित स्वच्छता जाँच करें:


इको 'इंट मेन(){}' > डमी.सी

cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | ग्रेप ': /lib'

इको 'इंट मेन(){}' > डमी.सी

cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | ग्रेप ': /lib'


कोई त्रुटि नहीं होनी चाहिए, और अंतिम कमांड का आउटपुट होगा (डायनामिक लिंकर नाम में प्लेटफ़ॉर्म-विशिष्ट अंतर की अनुमति):


[प्रोग्राम दुभाषिया का अनुरोध: /lib64/ld-linux-x86-64.so.2]

[प्रोग्राम दुभाषिया का अनुरोध: /lib64/ld-linux-x86-64.so.2]


की छवि

ध्यान रखें कि 64-बिट सिस्टम पर / दायित्व यह हमारे डायनामिक लिंकर का स्थान है, लेकिन इसे /lib64 में एक प्रतीकात्मक लिंक के माध्यम से एक्सेस किया जाता है।


नोट

32-बिट सिस्टम पर इंटरप्रेटर /lib/ld-linux.so.2 होना चाहिए।

नोट

32-बिट सिस्टम पर इंटरप्रेटर /lib/ld-linux.so.2 होना चाहिए।

अब सुनिश्चित करें कि हम सही स्टार्ट फ़ाइलों का उपयोग करने के लिए तैयार हैं:


grep -o '/usr/lib.*/crt[1in].*सफल' dummy.log

grep -o '/usr/lib.*/crt[1in].*सफल' dummy.log


अंतिम कमांड का आउटपुट होना चाहिए:


/usr/lib/../lib/crt1.o सफल हुआ

/usr/lib/../lib/crti.o सफल हुआ

/usr/lib/../lib/crtn.o सफल हुआ

/usr/lib/../lib/crt1.o सफल हुआ

/usr/lib/../lib/crti.o सफल हुआ

/usr/lib/../lib/crtn.o सफल हुआ


सत्यापित करें कि कंपाइलर सही हेडर फ़ाइलों की खोज कर रहा है:


grep -B1 '^ /usr/include' dummy.log

grep -B1 '^ /usr/include' dummy.log

इस कमांड को निम्नलिखित आउटपुट लौटाना चाहिए:


#include <...> खोज यहां शुरू होती है:

/ usr / शामिल हैं

#include <...> खोज यहां शुरू होती है:

/ usr / शामिल हैं

इसके बाद, सत्यापित करें कि नए लिंकर का उपयोग सही खोज पथों के साथ किया जा रहा है:


grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|जी'

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|जी'

उन पथों के संदर्भ जिनमें '-linux-gnu' वाले घटक हैं, को अनदेखा किया जाना चाहिए, लेकिन अन्यथा अंतिम कमांड का आउटपुट होना चाहिए:


खोज_DIR("/usr/lib") खोज_DIR("/lib")

खोज_DIR("/usr/lib") खोज_DIR("/lib")

इसके बाद सुनिश्चित करें कि हम सही libc का उपयोग कर रहे हैं:


grep "/lib.*/libc.so.6" dummy.log

grep "/lib.*/libc.so.6" dummy.log

अंतिम कमांड का आउटपुट होना चाहिए:


/lib/libc.so.6 को खोलने का प्रयास सफल रहा

/lib/libc.so.6 को खोलने का प्रयास सफल रहा

अंत में, सुनिश्चित करें कि GCC सही डायनेमिक लिंकर का उपयोग कर रहा है:


ग्रेप को डमी.लॉग मिला

ग्रेप को डमी.लॉग मिला

अंतिम कमांड का आउटपुट होना चाहिए (डायनामिक लिंकर नाम में प्लेटफ़ॉर्म-विशिष्ट अंतर की अनुमति देते हुए):


/lib/ld-linux-x86-64.so.2 पर ld-linux-x86-64.so.2 मिला

/lib/ld-linux-x86-64.so.2 पर ld-linux-x86-64.so.2 मिला

यदि आउटपुट ऊपर दिखाए अनुसार प्रदर्शित नहीं होता है या बिल्कुल प्राप्त नहीं होता है, तो कुछ गंभीर रूप से गलत है। समस्या कहां है, इसका पता लगाने और उसे ठीक करने के लिए जांच करें और चरणों का दोबारा पता लगाएं। सबसे संभावित कारण यह है कि स्पेक्स फ़ाइल समायोजन में कुछ गड़बड़ हो गई है। प्रक्रिया जारी रखने से पहले किसी भी मुद्दे को हल करने की आवश्यकता होगी।

एक बार जब सब कुछ सही ढंग से काम करने लगे, तो परीक्षण फ़ाइलें साफ़ करें:


आरएम -वी डमी.सी ए.आउट डमी.लॉग

आरएम -वी डमी.सी ए.आउट डमी.लॉग


OnWorks पर शीर्ष OS क्लाउड कंप्यूटिंग: