2011-11-18 33 views
10

मैक ओएस एक्स पर, DYLD प्रारूप में द्विआधारी निष्पादनयोग्य "लोडर कमांड" कि पुस्तकालय लोड हो रहा है प्रणाली कैसे फ़ाइल की सामग्री को संभालने के लिए हिदायत होते हैं। विशेष रूप से, लोडर कमांड सिस्टम को निर्देश देता है जहां निर्भर पुस्तकालयों की खोज की जानी चाहिए, आदिमैं एक DYLD लोडर कमांड कैसे स्थापित कर सकता हूं जिसे स्पष्ट रूप से एलडी द्वारा समर्थित नहीं किया जाता है?

आप "otool -l/path/to/your" चलाकर अपने सिस्टम पर किसी भी बाइनरी के लिए लोडर कमांड की पूरी सूची देख सकते हैं/एप्लिकेशन "।

सामान्यतया इन लोडर आदेशों एक परियोजना की संकलन के लिंक के चरण के दौरान "ld" उपकरण द्वारा निर्धारित कर रहे हैं।

मेरा प्रश्न है, मैं क्या लोडर प्रचारित प्रकार है कि समर्थित नहीं हैं (जाहिरा तौर पर) ld द्वारा आदेशों को जोड़ने के लिए क्या करने की जरूरत है?

विशेष रूप से, मैं एलसी_DYLD_ENVIRONMENT लोडर कमांड का लाभ लेना चाहता हूं, जिसका प्रयोग बाइनरी के लोडर कमांड टेबल में एक स्ट्रिंग निर्दिष्ट करने के लिए किया जा सकता है जिसे लोड किया जाना चाहिए और पर्यावरण परिवर्तनीय सेटिंग्स के संदर्भ में मूल्यांकन किया जाना चाहिए निष्पादन योग्य।

मैं ld के लिए किसी भी तर्क है कि इस सुविधा होगी नहीं दिख रहा। "-sectcreate" की तरह कुछ लेकिन लोडर कमांड की सामग्री को विशेष रूप से जोड़ने के लिए, जो मैं बाद में हूं।

मैं जानता हूँ कि यह संभव है क्योंकि मैक ओएस एक्स पर कम से कम एक मानक अनुप्रयोग का उपयोग करता है: सफारी। लेकिन मुझे नहीं पता कि वे बाइनरी की किसी तरह की पोस्ट-लिंक मालिश द्वारा इसे प्राप्त करते हैं, अगर वे एलडी के कस्टम संस्करण का उपयोग कर रहे हैं जो कस्टम लोडर कमांड को बनाने और चेन करने के बारे में जानता है, या यदि वे शोषण कर रहे हैं ld कमांड की एक सामान्य-purpopse सुविधा जिसे मैं समझने में सक्षम नहीं हूं।

उत्तर

14

ऐसा लगता है कि आप -dyld_env उपयोग कर सकते हैं, तो जैसे: "-dyld_env DYLD_FRAMEWORK_PATH = /"। यह मैन पेज में प्रलेखित नहीं है, लेकिन ld64 के Options.cpp में पाया जा सकता है और चेंजलॉग फ़ाइल में उल्लिखित है। यदि आप इसे एक्सकोड से करने की कोशिश कर रहे हैं, तो आपको शायद इसे ऐसा करना होगा: "-Xlinker -dyld_env -Xlinker DYLD_FRAMEWORK_PATH = /"।

ध्यान देने योग्य एक बात: यदि आप dyld के dyld.cpp को देखते हैं, तो आप देखेंगे कि यह केवल पर्यावरण चर को अनुमति देता है जो DYLD_ से शुरू होता है और _PATH के साथ समाप्त होता है।

+0

बढ़िया! धन्यवाद। मुझे ट्विटर के माध्यम से कुछ फीडबैक भी मिला, जिसने ध्यान दिया कि एलसी_DYLD_ENVIRONMENT वास्तव में आपको मनमाने ढंग से पर्यावरण चर परिभाषित नहीं करता है, केवल डीवाईएलडी लोडिंग को प्रभावित करने वाले लोगों को ही परिभाषित करता है। तो उस सीमा तक नीचे की ओर से एलएसई पर्यावरण संरक्षण मेरी तत्काल जरूरतों के लिए अधिक अनुकूल है, लेकिन आपका उत्तर प्रश्न के आधार के लिए सबसे उपयुक्त संदर्भ है। – danielpunkass

8

अपने निष्पादन योग्य एक मानक ओएस एक्स आवेदन बंडल के रूप में संरचित है (अर्थात है कि एक उपयोगकर्ता द्वारा शुरू की जा सकती है एक .app), आवेदन विशिष्ट वातावरण चर निर्दिष्ट करने के लिए परंपरागत तरीके LSEnvironment कुंजी का उपयोग कर अपने plist फ़ाइल के माध्यम से है । अधिक जानकारी के लिए here देखें।

+0

धन्यवाद, नेड! यह सवाल के लिए एक कैननिकल उत्तर नहीं है, लेकिन वास्तव में यह DYLD लोडर कमांड सुविधा में मेरी वर्तमान रुचि के दिल में आता है। मैं वर्णित उद्देश्यों के लिए एलएसई पर्यावरण का उपयोग करूंगा! – danielpunkass