बस आपको कुछ संदर्भ देने के लिए, मैं यह हासिल करने की कोशिश कर रहा हूं: मैं .so फ़ाइल में वर्जन स्ट्रिंग रखने के लिए किसी साझा ऑब्जेक्ट फ़ाइल में एक कॉन्स char * एम्बेड कर रहा हूं। मैं डेटा विश्लेषण कर रहा हूं और यह स्ट्रिंग मुझे डेटा को यह बताती है कि सॉफ़्टवेयर के किस संस्करण ने इसे बनाया है। यह सब ठीक काम करता है।एनएम प्रतीक मूल्य में ऑफसेट?
मेरे पास जो मुद्दा है, वह है जब मैं सीधे .so लाइब्रेरी से स्ट्रिंग को पढ़ने की कोशिश करता हूं। मैं
nm libSMPselection.so | grep _version_info
का उपयोग करें और
000000000003d968 D __SMPselection_version_info
यह सब ठीक है और अपेक्षा के अनुरूप (चार * _SMPselection_version_info कहा जाता है) प्राप्त करने की कोशिश। हालांकि मैं अब फ़ाइल खोलने, 0x3d968 की तलाश करने और मेरी स्ट्रिंग पढ़ने शुरू करने की उम्मीद करता, लेकिन मुझे जो भी मिलता है वह कचरा है।
जब मैं .so फ़ाइल खोलता हूं और केवल स्ट्रिंग की सामग्री (मुझे पता है कि यह कैसे शुरू होता है) की खोज करता है, तो मैं इसे 0x2e0b4 पते पर पा सकता हूं। इस पते पर यह शून्य है और शून्य के रूप में समाप्त हो गया है। (मैं अब इस विधि का उपयोग कर रहा हूं।)
मैं कंप्यूटर वैज्ञानिक नहीं हूं। क्या कोई मुझे बता सकता है कि एनएम द्वारा दिखाए गए प्रतीक मूल्य सही नहीं हैं, या अलग-अलग, प्रतीक मूल्य क्या है यदि यह प्रतीक का पता नहीं है?
यह एक अच्छा विचार है। मैं अभी कोशिश कर रहा हूँ। केवल एक समस्या है: जिन पुस्तकालयों का मैं परीक्षण कर रहा हूं उनमें अन्य पुस्तकालयों पर निर्भरता की एक लंबी श्रृंखला है। यदि मैं उन्हें dlopen से लोड करने का प्रयास करता हूं तो मुझे सिग्नल-नहीं-मिली त्रुटियां मिलती हैं। जिस संस्करण स्ट्रिंग में मुझे रूचि है, उसकी कोई निर्भरता नहीं है। मैं निर्भरता को नजरअंदाज कैसे कर सकता हूं? – Simon
मैंने चेक किया है। यह बहुत अच्छा काम करता है अगर मेरे पास सभी निर्भरताएं लोड हों जो मेरे दो उपयोग-मामलों में से एक है। विचार के लिए धन्यवाद। – Simon