2010-08-29 10 views
5

मेरे पास एक स्थिर लाइब्रेरी है जिसमें कुछ जेएनआईसीएलएल फ़ंक्शंस हैं, यानी उन्हें जेवीएम से कॉल करने की उम्मीद है और कभी भी साझा लाइब्रेरी द्वारा संदर्भित साझा लाइब्रेरी द्वारा संदर्भित नहीं किया जाता है।मैं कुछ कार्यों को छीनने से कैसे रोकूं?

हालांकि, ऐसा लगता है कि फ़ंक्शन स्ट्रिपिंग जेएनआईसीएएल फ़ंक्शन को खत्म कर रहा है (यह arm-eabi-objdump -t में दिखाई नहीं दे रहा है)। मैं एक असंभव स्थिति के साथ एक डमी फ़ंक्शन जोड़कर इसके आसपास काम कर रहा हूं जो जेएनआईसीएलएल फ़ंक्शन को कॉल करता है, लेकिन यह गंदा है। मुझे पता है कि कुछ मॉड्यूल को उनके अप्रयुक्त डेटा को छीनने से रोकने के लिए एक लिंक विकल्प है, लेकिन यह क्या है? और मैं .mk फ़ाइल में उस विकल्प को कैसे निर्दिष्ट करूं? मैंने हाथ-एबी-एलडी में तुरंत कुछ भी स्पष्ट नहीं देखा।

संयोग से, फ़ंक्शन स्ट्रिपिंग साझा लाइब्रेरी में जेएनआईसीओएल फ़ंक्शंस को नहीं हटाती है, लेकिन यह उन साझा लाइब्रेरी से हटा दी जाएगी जो साझा लाइब्रेरी लिंक कर रही हैं। इसके लिए क्या कारण है?

+1

यह अभी आया - http://stackoverflow.com/questions/3549432/preventing-functions-from-being-stripped-from-a-static-library-when-linked-into-a/3559733#3559733 – fadden

+0

और यह निश्चित रूप से मेरा व्यक्तिगत उत्तर लड़का है :) इसे एक प्रश्न के रूप में पोस्ट करना चाहते हैं तो मैं इसे स्वीकार कर सकता हूं? (ठीक है, वह, या मैं अपना खुद का प्रश्न डुप्ली के रूप में बंद कर सकता हूं) – EboMike

उत्तर

5

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

एनडीके स्थापना में "निर्माण" निर्देशिका पर जाएं और LOCAL_STATIC_LIBRARIES के सभी उदाहरणों की खोज करें। उन सभी को कॉपी और पेस्ट करें और उस संस्करण को एक संस्करण जोड़ें जो LOCAL_STATIC_WHOLE_LIBRARIES के साथ एक ही चीज़ करता है।

सटीक होना: निर्माण/कोर/build-binary.mk में, आप की आवश्यकता होगी:

LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES)) 
LOCAL_STATIC_WHOLE_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_WHOLE_LIBRARIES)) 

[...]

static_libraries := $(call map,static-library-path,$(LOCAL_STATIC_LIBRARIES)) 
static_whole_libraries := $(call map,static-library-path,$(LOCAL_STATIC_WHOLE_LIBRARIES)) 

[...]

$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_LIBRARIES)) 
$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_WHOLE_LIBRARIES)) 

[...]

$(LOCAL_BUILT_MODULE): $(static_libraries) $(static_whole_libraries) $(shared_libraries) 

[...]

$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries) 
$(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(static_whole_libraries) 

नोट STATIC_WHOLE और WHOLE_STATIC के बीच विसंगति - कि यह कैसे NDK में है, मैं इसे इस तरह से भले ही यह असंगत है रखने के लिए चुना है है।

अब, अंत में, निर्माण/टूलचेन्स/आर्म-एबी-4.4.0/setup.mk में: साझा पुस्तकालयों के लिए पहले से ही PRIVATE_WHOLE_STATIC_LIBRARIES ब्लॉक है। आप इसे एक्जिक्यूटिव के लिए भी जोड़ना चुन सकते हैं, हालांकि यह संभवतः आवश्यक नहीं है।

1

the other question देखें।

+0

धन्यवाद! मैंने नहीं देखा कि जब मैं एक जवाब की तलाश में था। मैं अपने प्रश्न को अन्य धागे पर दोहरा दूंगा - क्या आप एक त्वरित उदाहरण पोस्ट कर सकते हैं कि आपको Android.mk फ़ाइल को सेट करने की आवश्यकता होगी (कम से कम दो पंक्तियां जोड़ने के लिए प्रासंगिक हैं)? – EboMike

+0

मैंने दूसरे प्रश्न पर एक नोट जोड़ा। मुझे नहीं पता कि एनडीके बिल्ड सिस्टम में क्या करना है, लेकिन अगर यह सामान्य एंड्रॉइड मेकफ़ाइल की तरह कुछ भी काम करता है तो आप फ्लैग को LOCAL_LDFLAGS में जोड़ सकते हैं। – fadden

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