के बिना लिनक्स में फ़ंक्शन इंटरपोजिशन मैं वर्तमान में एक प्रोजेक्ट पर काम कर रहा हूं जहां मुझे कई सिस्टम कॉल और निम्न स्तर के कार्यों जैसे mmap
, brk
, sbrk
के उपयोग को ट्रैक करने की आवश्यकता है। अब तक, मैं फ़ंक्शन इंटरपोजिशन का उपयोग करके ऐसा कर रहा हूं: मैं उसी नाम के साथ एक रैपर फ़ंक्शन लिखता हूं जिसे मैं बदल रहा हूं (mmap
उदाहरण के लिए), और मैं इसे LD_PRELOAD
पर्यावरण चर सेट करके प्रोग्राम में लोड करता हूं। मैं एक पॉइंटर के माध्यम से वास्तविक फ़ंक्शन को कॉल करता हूं जिसे मैं dlsym
से लोड करता हूं।बिना किसी dlsym
दुर्भाग्यवश, मैं जो फ़ंक्शन लपेटना चाहता हूं, sbrk
, आंतरिक रूप से dlsym
द्वारा उपयोग किया जाता है, इसलिए जब मैं प्रतीक लोड करने का प्रयास करता हूं तो प्रोग्राम क्रैश हो जाता है। sbrk
लिनक्स में सिस्टम कॉल नहीं है, इसलिए मैं इसे अप्रत्यक्ष रूप से कॉल करने के लिए syscall
का उपयोग नहीं कर सकता।
तो मेरा सवाल यह है कि, मैं dlsym
का उपयोग किए बिना उसी नाम के रैपर फ़ंक्शन से लाइब्रेरी फ़ंक्शन कैसे कॉल कर सकता हूं? क्या कोई कंपाइलर चाल है (जीसीसी का उपयोग करके) जो मुझे मूल कार्य को संदर्भित करने देता है?
यह बहुत अच्छा है। मैंने कभी भी स्क्रैप विकल्प के बारे में नहीं सुना था, लेकिन यह वही है जो मुझे चाहिए। धन्यवाद। –
स्पष्टीकरण के लिए, निष्पादन योग्य लिंक करते समय या रैपर वाले एलडी_PRELOAD लाइब्रेरी को लिंक करते समय - स्क्रैप ध्वज को पारित करने की आवश्यकता होती है? साथ ही, क्या आप निष्पादन योग्य की पीएलटी प्रविष्टियों को संशोधित करने के बारे में अधिक जानकारी प्रदान करने पर विचार करेंगे? –
आपके लिए * target * ऐप को --wrap से लिंक करने के लिए डिज़ाइन किया गया उपयोग केस है। यह एलडी_PRELOAD केस के लिए भी काम करना संभव हो सकता है, मुझे यकीन नहीं है, मुझे परीक्षण करना होगा। –