2012-04-30 16 views
9

के खिलाफ मैं कर दिया गया है पार संकलन कुछ लिनक्स उपकरण (और मेरी अपनी सी कोड के कुछ) एंड्रॉयड के लिए और एक चुनौतियों मैं का सामना करना पड़ता है कि है जो Android के libc कुछ याद आ रही/छीन घटक हैं और है की मैं अंत में इस पर Android के libc के साथ कामएंड्रॉयड स्टेटिक लिंकिंग गतिशील लिंकिंग बनाम glibc

Q1 (जैसे इस http://credentiality2.blogspot.com/2010/08/compile-ncurses-for-android.html की तरह एक समस्या के लिए) बनाने के लिए मेरी कोड पैचिंग: मैं कैसे हाथ toolchain के साथ, जबकि पार संकलन के बारे में स्थिर glibc (और अन्य निर्भरता) से लिंक हो जाते (या ndk-build)?

Q2: यह एंड्रॉयड के लिए बाइनरी के लिए glibc के खिलाफ स्थिर से जोड़ने के लिए एक अच्छा विचार है? अगर मैं स्थिर रूप से लिंक करना शुरू करता हूं तो क्या मुझे कुछ तोड़ने की उम्मीद करनी चाहिए? क्या कोई प्रदर्शन/स्मृति समस्याएं हैं?

मैं यहाँ से पेशेवरों और स्थिर गतिशील जोड़ने बनाम की विपक्ष के सबसे को समझने - C++ application - should I use static or dynamic linking for the libraries? और Static linking vs dynamic linking

तो मुझे पता है कि अगर मैं स्थिर Android के लिए glibc को जोड़ने जब पार संकलन बाइनरी होना चाहिए चाहते हैं।

उत्तर

5

पहले libc पर एक छोटा सा ध्यान दें। एंड्रॉइड libc जीएनयू libc (glibc) के बजाय बायोनिक libc (https://github.com/android/platform_bionic/) है। इस प्रकार एनडीके में निहित libc बायोनिक है, जैसा एंड्रॉइड उपकरणों पर उपलब्ध libc है।

जहां तक ​​glibc का संबंध है, यह NDK के साथ इसे बनाने के लिए संभव है। हालांकि, एंड्रॉइड उपकरणों पर स्थापित होने पर इसका नाम सिस्टम libc के साथ संघर्ष करेगा। ध्यान दें कि यह केवल तभी होता है जब आप एक गतिशील पुस्तकालय बनाने के लिए जाते हैं। यदि आप एक स्थिर लाइब्रेरी के रूप में जीएनयू libc बनाते हैं, तो ऊपर दिया गया पूरा मुद्दा सिडस्टेप किया गया है, क्योंकि आपको स्थिर पुस्तकालय स्थापित करने की आवश्यकता नहीं है।

अब आपके सवालों के जवाब:

  1. Q1: आप glibc NDK का उपयोग कर निर्माण कर रहे हैं, तो Android.mk चर BUILD_STATIC_LIBRARY का उपयोग करता है स्थिर पुस्तकालयों का निर्माण। हालांकि, अगर आप एनडीके का उपयोग नहीं करते हैं, तो आपको शायद सिरदर्द में प्रवेश करने की आवश्यकता होगी (पता नहीं कितना)। मैं आपको इस पर अधिक नहीं बता सकता क्योंकि मैंने ग्लिब का निर्माण करने की कोशिश नहीं की है, या तो स्थैतिक या गतिशील। साथ ही, ऐसा लगता है कि कम से कम गैर-मोबाइल प्लेटफॉर्म के लिए ग्लिब के साथ स्थिर लिंकिंग बहुत निराश होती है।

  2. एक टूटना दृष्टिकोण से, वहाँ स्थिर और गतिशील जोड़ने में कोई अंतर नहीं है। स्टार्ट-अप व्यूपॉइंट से, एक स्थिर निष्पादन योग्य तेज़ी से शुरू होता है क्योंकि डायनामिक लाइब्रेरीज़ लोडिंग चरण की आवश्यकता नहीं होती है। स्थिर या गतिशील लिंक किए गए निष्पादन योग्य में कोई स्मृति या निष्पादन गति दंड नहीं है। स्थैतिक निष्पादन योग्य के लिए डिस्क संग्रहण आवश्यकता बड़ी है।

जहाँ तक बायोनिक libc लापता कार्यक्षमता के साथ समस्याओं के रूप में, आप सबसे जीएनयू सॉफ्टवेयर है, जो द्वारा प्रयोग किया जाता विधि का उपयोग करें, एक समारोह के मामले में यह प्रणाली पुस्तकालयों से याद आ रही है की अपनी खुद की कार्यान्वयन प्रदान कर सकते हैं। मैंने फाइल-5.11 संकलित किया है, जीएनयू ने 3.82, एंडफुट-2.8 को एंड्रॉइड के लिए एनडीके टूलचेन्स पास करने/ऑटोटूल (./configure ...) में libs/libs को पास किया है। ऐसा लगता है कि इन कार्यक्रमों में अधिकांश गैर-कोर लाइब्रेरी फ़ंक्शन के कार्यान्वयन होते हैं, यदि मानक पुस्तकालय उन्हें प्रदान नहीं करते हैं (इस मामले में बायोनिक)।

नोट: मैं कोशिश करता हूँ और एक स्थिर glibc का निर्माण और के रूप में इस सवाल का जवाब अद्यतन और जब मैं सफल हो/असफल।

+1

यह डिस्क पर केवल उपयोग नहीं है - स्मृति में भी वृद्धि हुई है। जब आप बायोनिक libc के खिलाफ लिंक और एंड्रॉइड ऐप की जेनी लाइब्रेरीज़ को लिंक करते हैं, तो आप पहले से ही स्मृति में एक प्रतिलिपि के लिए साझा रीड-ओनली एक्सेस प्राप्त करते हैं। –

+0

क्या आप मुझे इस बारे में जानकारी के स्रोत के बारे में बता सकते हैं? मैं और जानना चाहता हूं, लेकिन इस पर कुछ भी नहीं मिला। मुझे पता है कि यदि पुस्तकालयों में कोई डेटा होता है, तो डेटा प्रक्रियाओं के बीच साझा नहीं होता है, हालांकि लाइब्रेरी कोड इसके आंतरिक डेटा चर बदलता है, तो यह स्मृति पृष्ठों की कॉपी-ऑन-राइट प्रतिकृति का मामला हो सकता है। – Samveen

+0

मेरा मानना ​​है कि क्रिसस्ट्रैटन का उल्लेख है - स्थिर रूप से जुड़े libc के मामले। प्रत्येक प्रक्रिया एक ही पुस्तकालय के सभी वर्गों की अपनी पूरी प्रतिलिपि के साथ खत्म हो जाएगी। गतिशील लिंकिंग के साथ, आप सही हैं @ सैमवेन – Tuxdude

2

यदि आप बायोनिक के बजाय ग्लिब का उपयोग करने जा रहे हैं, तो यह एनएनडी की बजाय एक (संगत कर्नेल जनरेशन) आर्म-लिनक्स डिस्ट्रो के टूलचैन का उपयोग करने के लायक हो सकता है।यह विशेष रूप से सच होगा यदि आप कमांड लाइन निष्पादन योग्य बना रहे थे। (लोगों ने प्रयोगात्मक रूप से एंड्रॉइड उपकरणों पर क्रोट डेबियन वातावरण को जी 1 पर वापस ले जाया है)

एक जेनी सब (जो देशी आवेदन कोड के लिए केवल आधिकारिक रूप से अनुमोदित वाहन है) के लिए यह थोड़ा "दिलचस्प" हो सकता है टूलचेन, जैसा कि आप एक ऐसी प्रक्रिया में चल रहे हैं जो पहले ही मैप किया गया है और दल्विक वीएम का समर्थन करने के लिए बायोनिक लिबैक का निरंतर उपयोग कर रहा है। संभवतः यदि आप लाइब्रेरी की अपनी निर्भरताओं को स्थिर रूप से लिंक करते हैं तो आप नाम विवादों में नहीं भागेंगे, लेकिन मुझे उम्मीद है कि आप जो भी रास्ता चुनते हैं वह आंतरिक कार्यकलापों के बारे में एक सीखने का अनुभव होगा - यह कि यह एक बुरी चीज नहीं है।

क्या आपके पास ncurses होना है? मैंने सफलतापूर्वक एंड्रॉइड के लिए ndk के साथ शाप बनाया। यह भी विचार करें कि क्या कार्यक्रम गंभीरता से लीवरेज कर रहा है (यानी, क्या आप वास्तव में पर्याप्त टेक्स्ट स्वरूपण कर रहे हैं?), या बस इसे कुछ छोटी चीज़ों के लिए उपयोग कर रहे हैं क्योंकि यह लक्ष्य प्रणालियों पर उपलब्ध माना जाता था?

+0

आप इस प्रश्न का उत्तर दे सकते हैं और इस प्रश्न का उत्तर दे सकते हैं: http://stackoverflow.com/questions/10798357/want-to-compile-native-android-binary-i-can- चलाने में टर्मिनल-ऑन-फोन –

संबंधित मुद्दे