2011-05-13 32 views
7

क्या ld.so.preload का उपयोग करने और 32 बिट और 64 बिट दोनों बाइनरी को कवर करने का कोई तरीका है?एक बहु संग्रह सेटअप में /etc/ld.so.preload का उपयोग

यदि मैं ld.so.preload में गलती हैंडलर के 32 बिट और 64 बिट संस्करणों को सूचीबद्ध करता हूं तो लोडर हमेशा शिकायत करता है कि उनमें से कोई भी मेरे द्वारा चलाए जाने वाले आदेश के लिए प्रीलोड करने में विफल रहता है। वास्तव में धरती हिल रही है क्योंकि त्रुटि अधिक चेतावनी है लेकिन मैं निश्चित रूप से प्रिंटआउट के बिना कर सकता हूं।

एक पूर्ण पथ निर्दिष्ट करने के बजाय मैंने बस "segv_handler.so" निर्दिष्ट करने की कोशिश की है कि लोडर आर्क उपयुक्त पथ में lib का चयन करेगा (32 बिट संस्करण/lib और 64 बिट संस्करण/lib64 में है)।

स्पष्ट रूप से संभावना नहीं है।

क्या वास्तुशिल्प रूप से जागरूक होने के लिए ld.so.preload को सेटअप करने का कोई तरीका है? या अगर त्रुटि संदेश बंद करने का कोई तरीका नहीं है?

उत्तर

1

अफसोस की बात है, मुझे लगता है कि जवाब "ऐसा मत करो" हो सकता है।

glibc से

, elf/rtld.c:

वहाँ आम तौर पर कोई ld.so.preload फ़ाइल, यह केवल आपात स्थिति और परीक्षण के लिए इस्तेमाल किया जाना चाहिए है। तो खुली कॉल आदि आमतौर पर विफल होना चाहिए। गैर-मौजूदा फ़ाइल पर एक्सेस() का उपयोग करना खुले() का उपयोग करने से तेज़ है। तो हम इसे पहले करते हैं। यदि यह सफल होता है तो हम काम से लगभग दोगुना करते हैं लेकिन इससे कोई फर्क नहीं पड़ता, क्योंकि यह उत्पादन के उपयोग के लिए नहीं है।

2

इस तरह ld.so.preload का उपयोग करने का प्रयास करने का कोई कारण नहीं है। डिफ़ॉल्ट रूप से एलडी यह जानकर काफी समझदार है कि यदि आप 64 बिट एब को देखने के लिए 64 बिट ऐप चला रहे हैं, और 32 बिट के साथ ही।

बिंदु में प्रकरण, यदि आप

/lib64/libawesome.so /lib/libawesome.so

है और तुम

जीसीसी -lawesome -ओ funtime funtime.c

कोशिश

यह जीसीसी जो भी डिफ़ॉल्ट बनाना चाहता है, वह चुन देगा, एलडी उस बिल्ड के लिए गलत बिट आकार के पुस्तकालयों को छोड़ देगा।

जीसीसी -m64 -lawesome -ओ funtime funtime.c 64 बिट ले जाएगा एक

जीसीसी -m32 -lawesome -ओ funtime funetime.c 32 बिट एक का चुनाव करेगा।

यह मानती है कि /etc/ld.so.conf सूचियों/lib और डिफ़ॉल्ट रूप से/lib64 ..

1

आप 32 और 64 बिट पुस्तकालय पथ नाम में विशेष विस्तार कुंजियों का उपयोग कर सकते हैं। उदाहरण के लिए आप /lib/$PLATFORM/mylib.so का उपयोग कर सकते हैं और /lib/i386/mylib.so और /lib/x86_64/mylib.so बना सकते हैं। लिंक्ड आपके निष्पादन योग्य के लिए सही एक का चयन करेगा।

4

यह काम करता है:

  1. डाल पुस्तकालय के तहत/path/32 बिट एक के लिए lib, और के तहत/path/lib64 64 बिट एक डाल दिया और वे एक ही नाम
  2. में निम्न पंक्ति डाल होना चाहिए /etc/ld.so.preload: /path/$LIB/libname.so

$ उदारीकरण मूल्य "lib" (32 बिट के लिए) या "lib64" (64 बिट के लिए) स्वचालित रूप से मिल जाएगा।