2011-03-22 19 views
5

के लिए काम नहीं कर रहा है मैं लिनक्स में लिखने() सिस्टम कॉल को कैप्चर करने के लिए LD_PRELOAD का उपयोग कर रहा हूं। मैं इसे सिस्टम कॉल लिखने और इसे काम करने के लिए सफलतापूर्वक करने में सक्षम हूं।LD_PRELOAD printf

लेकिन जब मैं printf() को कॉल करता हूं तो उस समय यह काम नहीं करता है। अगर हम स्ट्रेस का उपयोग करके प्रिंटफ स्टैक ट्रेस का निरीक्षण करते हैं तो मुझे पता चला कि अंत में printf कॉल कंसोल को लिखने के लिए लिखते हैं() सिस्टम कॉल, लेकिन उस समय मेरे लिखने() सिस्टम कॉल को वास्तव में लिखने() सिस्टम कॉल को कॉल करने से पहले नहीं कहा जाता है ।

किसी को भी कोई विचार है कि यह क्यों हो रहा है?

+0

कुछ कोड स्निपेट पोस्ट करें ताकि हम देख सकें कि क्या हो रहा है। –

+0

[यह] (https://stackoverflow.com/questions/13374240/why-ld-preload-doesnt-work-for-one-of-loaded-shared- पुस्तकालय) भी संबंधित हो सकता है। – Albert

उत्तर

11

एक लाइब्रेरी से दूसरे में या निष्पादन योग्य से गतिशील रूप से लोड की गई लाइब्रेरी में फ़ंक्शन कॉल पीएलटी (प्रक्रिया लिंकेज तालिका) के माध्यम से जाते हैं और एलडी_PRELOAD के उपयोग से पुनर्निर्देशित करने में सक्षम होते हैं। हालांकि, पुस्तकालय के भीतर फ़ंक्शन कॉल संकलित समय पर हल किया जा सकता है और पीएलटी के माध्यम से नहीं जा सकता है। इसलिए वे LD_PRELOAD द्वारा रीडायरेक्ट करने में असमर्थ हैं। चूंकि प्रिंटफ और लेखन दोनों libc.so.6 में संकलित हैं, इसलिए प्रिंटफ से लिखने के लिए कॉल पीएलटी के माध्यम से कभी भी संभव पुनर्निर्देशन की तलाश में नहीं जाता है, लेकिन जब आप सीधे अपने आवेदन (या किसी अन्य साझा लाइब्रेरी से) लिखते हैं तो यह करता है ।