2013-03-05 6 views
12

ठीक है, मुझे पता है कि आप वास्तव में ओएस एक्स बाइनरी से उद्देश्य-सी प्रतीकों को कैसे रोक नहीं सकते हैं, इस बारे में अन्य पोस्ट हैं क्योंकि वे ओब्जे-सी के लिए बिल्कुल काम करने के लिए जरूरी हैं, लेकिन मेरा मामला थोड़ा सा है विभिन्न।ओएस एक्स बाइनरी से उद्देश्य-सी प्रतीकों को कैसे पट्टी करें?

मेरे पास एक एकल बाइनरी है जो एक बंडल है। इसका उद्देश्य या तो एक वीएसटी प्लगइन, या ऑडियोयूनिट प्लगइन के रूप में उपयोग किया जाना है। विचार यह है कि बाइनरी में दोनों प्रारूपों के लिए सभी प्रविष्टि बिंदु शामिल हैं, और आप इसे एक बार संकलित करते हैं, और उसके बाद एक प्रतिलिपि को VST संस्करण के लिए ".vst" और ".component" एयू संस्करण के लिए । (यह Juce ढांचे BTW उपयोग कर रहा है।)

समस्या यह है कि ए.यू. पक्ष के लिए, आप कोको UI दृश्य बनाने की एक Obj सी वर्ग निर्यात करना होगा है। वीएसटी पक्ष पर, इस वर्ग का कभी भी उपयोग नहीं किया जाएगा। लेकिन अगर आपके पास एबलेटन लाइव जैसे होस्ट हैं जो आपको एक ही प्लगइन के एयू और वीएसटी संस्करणों को एक साथ लोड करने की अनुमति देता है, तो अब हम सामान्य ओबीजे-सी नेमस्पेस टकराव मुद्दे में भाग लेते हैं।

वीएसटी पक्ष पर, उस विशेष ओबीजे-सी कक्षा का कभी भी उपयोग नहीं किया जाएगा। तो मैं क्या करना चाहता हूं कि "स्ट्रिप" का उपयोग करके परिणामस्वरूप बाइनरी से उन ओब्जे-सी कक्षाओं को पट्टी करना पड़े। यह अभी भी दोनों प्रारूपों के लिए सब कुछ संकलित करने का लाभ बनाए रखता है।

वैसे भी, मैंने "strip -R stripfile.txt <path to binary>" का उपयोग करने का प्रयास किया है, जहां stripfile.txt में वे प्रतीक हैं जिन्हें मैं पट्टी करना चाहता हूं, लेकिन यह हमेशा यह कहने में विफल रहता है कि प्रतीक बाइनरी में नहीं मिल सकते हैं। मैंने स्ट्रिप फ़ाइल में नामों को उलझाने की कोशिश की है, लेकिन इससे मदद नहीं मिलती है (या मैं इसे गलत कर रहा हूं)।

यहाँ, प्रासंगिक प्रतीक है कि मैं उन्हें हटाना चाहते हैं "एनएम -m" द्वारा आउटपुट के रूप में:

000000000003bb00 (__TEXT,__text) non-external -[JuceDemoProjectAU description] 
000000000003bb60 (__TEXT,__text) non-external -[JuceDemoProjectAU interfaceVersion] 
000000000003ba00 (__TEXT,__text) non-external -[JuceDemoProjectAU uiViewForAudioUnit:withSize:] 
0000000000b02398 (__DATA,__objc_data) external _OBJC_CLASS_$_JuceDemoProjectAU 
0000000000b023c0 (__DATA,__objc_data) external _OBJC_METACLASS_$_JuceDemoProjectAU 

कोई भी विचार?

बीटीडब्लू, मैं बाद में गतिशील रूप से कक्षा में प्रश्न (एक अद्वितीय नाम का उपयोग करके) को पंजीकृत करने में सक्षम हूं, जो समस्या को हल करता है। हालांकि, अगर मैं स्ट्रिप काम कर सकता हूं, तो मैं संभावित रूप से क्षेत्र में मौजूदा मौजूदा बाइनरी के लिए समाधान तैनात कर सकता हूं।

+6

बस संकलित न करें और उन्हें पहले स्थान पर एयू/वीएसटी में लिंक न करें - इसके बजाय कई लक्ष्य सेट करें। – justin

+1

मुझे पता है कि मैं ऐसा कर सकता हूं, और वास्तव में जैसा कि मैंने पहले ही उल्लेख किया है कि मैं इसे कक्षा में गतिशील रूप से पंजीकृत करने के माध्यम से काम कर रहा हूं, जो कि अच्छा है क्योंकि यह अभी भी एक बार सबकुछ संकलित करने और अलग-अलग लक्ष्य/द्विआधारी नहीं होने की अनुमति देता है - परिणामस्वरूप बाइनरी अभी भी एक एयू या वीएसटी के रूप में उपयोग किया जा सकता है (यह नहीं कर सकता है कि यह compt-compile-it-for-VST दृष्टिकोण के माध्यम से नहीं कर सकता)। मैं अभी भी उत्सुक हूं यदि मौजूदा बाइनरी से ओब्जे-सी बाइनरी को पट्टी करने का कोई तरीका है, क्योंकि यह मेरे "बेहतर" फिक्स जहाज के लिए तैयार होने से पहले मौजूदा क्षेत्र में मौजूदा सुधार को ठीक करने की अनुमति देगा। – jimw

+0

प्रतीकों को हटाने से वर्ग संरचनाओं को नहीं हटाया जाएगा, इसलिए शायद यह वर्ग को लोड होने से नहीं रोकेगा (मुझे नहीं पता कि रनटाइम कक्षाओं को कैसे पाता है, लेकिन खोज प्रतीक केवल आरक्षित अनुभाग से देखकर कठिन होगा कक्षा की जानकारी के लिए)। आप बाइनरी में कक्षा का नाम बदलने की कोशिश कर सकते हैं, लेकिन सावधान रहना होगा कि आप किसी और चीज को प्रभावित नहीं करते हैं। मैं जस्टिन से सहमत हूं कि दो बार संकलित करना सबसे अच्छा विकल्प है, क्योंकि यह गतिशील पंजीकरण से आसान है। – ughoavgfhw

उत्तर

2

पिछले साल कोरौडियो-सूची पर इस तरह के बारे में कुछ धागा था: Collision between Cocoa classes for AU and VST plugins

प्रस्तावित समाधान register the classes dynamically था जो आप कहते हैं कि आप पहले से ही काम कर रहे हैं। यदि आपके जैसे प्रतीकों को पट्टी करने का कोई तरीका था, तो मुझे यकीन है कि इन लोगों को इसके बारे में पता होगा।

3

आप बस एक बाइनरी से कक्षा को नहीं हटा सकते हैं। हालांकि आप क्या कर सकते हैं उद्देश्य-सी रनटाइम को अपने प्लगइन में विश्वास करने के लिए कोई उद्देश्य-सी कोड नहीं है। बस __objc_imageinfo को __objc_imageinfX में बदलें, उदाहरण के लिए अपने वीएसटी प्लगइन बाइनरी में। वास्तव में Class JuceDemoProjectAU is implemented in both …/VSTPlugin and …/AUPlugin. One of the two will be used. Which one is undefined.

खबरदार, आपको: आप इसे आसानी से पर्ल के साथ क्या कर सकते हैं:

perl -pi -e 's/__objc_imageinfo/__objc_imageinfX/g' <path to binary> 

वीएसटी प्लगइन पैचिंग के बाद, सभी ऑब्जेक्टिव-सी प्रारंभ नजरअंदाज कर दिया जाएगा और आपको यह त्रुटि संदेश नहीं देखेंगे इस चाल का उपयोग न करें! आपकी समस्या का उचित समाधान या तो आपके प्लगइन के दो अलग-अलग संस्करणों को संकलित करना है या अन्य लोगों द्वारा सुझाए गए वर्गों को गतिशील रूप से पंजीकृत करना है।

+0

किसी कारण से मैं यह भी काम नहीं कर पा रहा था, ऑब्जेक्टिव सी प्रतीक कमांड को निष्पादित करने के बावजूद बाइनरी में रहते हैं। हालांकि, सिद्धांत में अच्छा विचार है। – Perception

+0

मैं यह उल्लेख करना भूल गया कि यह 64-बिट प्लगइन्स मानता है। 32-बिट प्लगइन के लिए, आप '__image_info' को' __image_infX' में बदलना चाहेंगे। – 0xced