मैं पर हाल ही में इसे करने के लिए एक संदर्भ में आए 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
पथ , आप प्रदान की गई डिफ़ॉल्ट पर, साझा किए गए ऑब्जेक्ट को लोड करने के लिए एप्लिकेशन लोडर को मजबूर कर सकते हैं।
डेवलपर्स इसका उपयोग साझा वस्तुओं के विभिन्न संस्करणों को प्रदान करके अपने अनुप्रयोगों को डीबग करने के लिए करते हैं।
हमने तैयार साझा वस्तुओं का उपयोग करके मौजूदा कार्यों को ओवरराइड करके, कुछ अनुप्रयोगों को हैक करने के लिए इसका उपयोग किया है।