2011-03-29 9 views
10

मैंने एक छोटी साझा लाइब्रेरी नहीं की है जो खुले, खुले 64, स्टेट और stat64 sys कॉल को अवरुद्ध करने का प्रयास करता है। जब मैं एलडी_PRELOAD निर्यात करता हूं और ओरेकल के एसक्लप्लस चलाता हूं, तो मैं खुले और खुले 64 कॉल के निशान देख सकता हूं, लेकिन स्टेट और स्टेट 64 कॉल का कोई निशान नहीं है। साझा लाइब्रेरी एक एकल सी फ़ाइल है जिसमें sys की सभी परिभाषाएं शामिल हैं। ऐसा क्यों होता है कि कुछ सिस्कोल को रोक दिया जाता है और अन्य नहीं करते हैं? आपकी सहायता के लिए धन्यवाद।सी और एलडी_PRELOAD। खुली और खुली 64 कॉल अवरुद्ध, लेकिन stat64

उत्तर

18

क्योंकि जीएनयू libc लागू करता open() और open64() आपकी अपेक्षानुसार (अर्थात वे सिर्फ गतिशील रूप से जुड़े हुए प्रतीकों कि आप LD_PRELOAD साथ में हुक कर सकते हैं कर रहे हैं), लेकिन कुछ stat() और stat64() के साथ विशेष है।

आप प्रतीकों libc (जैसे nm -D /libc/libc.so.6 के साथ) द्वारा निर्यात को देखें, तो आप देखेंगे कि यह वास्तव में प्रतीकों stat या stat64 प्रदान नहीं करता है! इन कार्यों के लिए

कॉल लिपटे रहे हैं - या तो संकलन समय पर (यदि संभव हो) इनलाइन कार्यों द्वारा <sys/stat.h> में, या (कि नाकाम रहने) libc_nonshared.a द्वारा प्रदान की स्थिर जुड़ा हुआ परिभाषाएँ।

वास्तविक गतिशील रूप से जुड़े फ़ंक्शंस जिन्हें __xstat() या __xstat64() कहा जाता है; और ये एक अतिरिक्त पहला तर्क लेते हैं, एक पूर्णांक, जो एक संस्करण संख्या है जो कॉलर द्वारा struct stat के लेआउट को इंगित करता है। इसके बजाए इन्हें हुक करने का प्रयास करें। । अगर आप /usr/include/sys/stat.h में देखने के लिए आप इस प्रभाव के लिए एक टिप्पणी मिल जाएगा fstat();

(यह सब की बात गतिशील रूप से जुड़े हुए libc जो struct stat के विभिन्न असंगत लेआउट और mode_t में बिट्स की परिभाषाओं का उपयोग बाइनरी समर्थन करने के लिए अनुमति देने के लिए है , fstat64(), lstat(), lstat64() और mknod() भी इसी तरह से प्रभावित होते हैं।)

+0

हाय मैथ्यू। आपकी सहायता के लिए धन्यवाद. लेकिन मैंने अभी देखा है कि कॉल को अवरुद्ध करने की समस्या केवल उन कार्यों के साथ होती है जिनके पास पैरामीटर के रूप में "स्ट्रक्चर stat64" है। यह fstat के लिए काम करता है, लेकिन fstat64 या stat64 के लिए नहीं। क्या यह मेरी कार्य परिभाषा में एक समस्या हो सकती है? या मैं __xstat64 और __fxstat64 को रोक दूंगा? एक बार फिर धन्यवाद। – klayme

+0

@ कलेमे: आपका स्वागत है, और उत्तर स्वीकार करने के लिए धन्यवाद - क्या इसका मतलब है कि आपको यह ठीक काम करने के लिए मिला है? (मुझे लगता है कि '__xstat64' और' __fxstat64' को अवरुद्ध करना सही है।) –

+0

यह http://www.tcm.phy.cam.ac.uk/sw/inodes64.html पर स्रोत के साथ संयुक्त होने पर मेरे लिए अच्छी तरह से काम करता है। वे 64-बिट संस्करणों को पैच नहीं करते हैं बल्कि केवल इंटरफ़ेस घोषित करते हैं। मैंने 32-बिट कंपाइलर को अनुमति देने के लिए भी उन्हें पैच किया जो कि 64-बिट इनोड को संभालने के लिए 'stat64()' को ठीक से कॉल कर रहा था। –

संबंधित मुद्दे