मैं पर हाल ही में इसे करने के लिए एक संदर्भ में आए proggit और (अब तक) यह नहीं समझाया गया है।
मुझे शक है कि यह हो सकता है, लेकिन मुझे यकीन नहीं है।
मैं पर हाल ही में इसे करने के लिए एक संदर्भ में आए proggit और (अब तक) यह नहीं समझाया गया है।
मुझे शक है कि यह हो सकता है, लेकिन मुझे यकीन नहीं है।
जवाबों:
यदि आप LD_PRELOADसाझा किए गए ऑब्जेक्ट के पथ पर जाते हैं, तो वह फ़ाइल किसी भी अन्य लाइब्रेरी (C रनटाइम सहित ) से पहले लोड की जाएगी libc.so। तो lsअपने विशेष malloc()कार्यान्वयन के साथ चलने के लिए , यह करें:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD। कारण यह है कि यह एक पर्यावरण चर रहा है, यह बाल प्रक्रियाओं द्वारा विरासत में मिला है - जिसमें मूल प्रक्रिया की तुलना में एक अलग कार्यशील निर्देशिका हो सकती है। इसलिए कोई भी सापेक्ष पथ लाइब्रेरी को प्रीलोड करने में विफल रहेगा।
आप एक ही प्रतीक के साथ एक पुस्तकालय बनाकर और पुस्तकालय को निर्दिष्ट करके स्टॉक पुस्तकालयों में प्रतीकों को ओवरराइड कर सकते हैं LD_PRELOAD।
कुछ लोग इसका उपयोग गैर-मानक स्थानों में पुस्तकालयों को निर्दिष्ट करने के लिए करते हैं, लेकिन LD_LIBRARY_PATHउस उद्देश्य के लिए बेहतर है।
साथ LD_PRELOADआप पुस्तकालयों पूर्वता दे सकते हैं।
उदाहरण के लिए आप एक पुस्तकालय लिख सकते हैं जो कार्यान्वित mallocऔर free। और इन्हें LD_PRELOADअपने साथ लोड करके mallocऔर freeमानक के बजाय निष्पादित किया जाएगा।
calloc? वह सब कुछ गड़बड़ नहीं करेगा?
mallocऔर मुफ्त में विशेष रूप से इसे बनाने की अनुमति देने के लिए glibc में डिज़ाइन किया गया है और स्टॉक callocआपके आयातित को कॉल करने का प्रबंधन करता है malloc। किसी भी अन्य कार्यों के साथ यह कोशिश मत करो। यह इतना अच्छा काम नहीं करेगा।
जैसा कि कई लोगों ने बताया, LD_PRELOADलाइब्रेरी को प्रीलोड करने के लिए। BTW, यदि सेटिंग कमांड द्वारा उपलब्ध है , तो आप चेक कर सकते हैं ldd।
उदाहरण: मान लीजिए कि आपको अपना प्रीलोड करने की आवश्यकता है libselinux.so.1।
> ldd /bin/ls
...
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)
इस प्रकार, अपना प्रीलोड वातावरण सेट करें:
export LD_PRELOAD=/home/patric/libselinux.so.1
अपनी लाइब्रेरी को फिर से जांचें:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOADकार्यों के साथ साझा किए गए पुस्तकालयों को सूचीबद्ध करता है जो मानक सेट को ओवरराइड /etc/ld.so.preloadकरता है , जैसे कि करता है। इन्हें लोडर द्वारा कार्यान्वित किया जाता है /lib/ld-linux.so। यदि आप कुछ चुने हुए कार्यों को ओवरराइड करना चाहते हैं, तो आप एक ओवरराइडिंग ऑब्जेक्ट फ़ाइल और सेटिंग बनाकर ऐसा कर सकते हैं LD_PRELOAD; इस ऑब्जेक्ट फ़ाइल में फ़ंक्शंस बस उन कार्यों को ओवरराइड करेंगे जो दूसरों को छोड़ रहे थे जैसे वे थे।
साझा पुस्तकालयों के बारे में अधिक जानकारी के लिए, http://tldp.org/HOWTO/Program-Library-HOWTO/sared-Inbooks.html देखें
यहाँ प्रीलोडिंग के बारे में एक विस्तृत ब्लॉग पोस्ट है:
यह निर्यात mylib.soकरने के लिए आसान है env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
निष्क्रिय करने के लिए :
$ export LD_PRELOAD=
unset LD_PRELOAD
जब LD_PRELOAD का उपयोग किया जाता है, तो फ़ाइल को पहले से लोड किए जाने वाले किसी अन्य
$export LD_PRELOAD=/path/libपरिवाद से पहले लोड किया जाएगा, यहां तक कि इसे कार्यक्रमों में भी उपयोग किया जा सकता है
का उपयोग करते हुए LD_PRELOADपथ , आप प्रदान की गई डिफ़ॉल्ट पर, साझा किए गए ऑब्जेक्ट को लोड करने के लिए एप्लिकेशन लोडर को मजबूर कर सकते हैं।
डेवलपर्स इसका उपयोग साझा वस्तुओं के विभिन्न संस्करणों को प्रदान करके अपने अनुप्रयोगों को डीबग करने के लिए करते हैं।
हमने तैयार साझा वस्तुओं का उपयोग करके मौजूदा कार्यों को ओवरराइड करके, कुछ अनुप्रयोगों को हैक करने के लिए इसका उपयोग किया है।