2009-12-19 15 views
7
में एक द्विआधारी पट्टी

MacOS 10.6, अगर मैं एक फ़ाइल "unwanted.c" जो शामिल है:कैसे वास्तव में MacOS

class secret_thing { 
public: 
secret_thing() {} 
void revealing_method_name() {} 
}; 

main() 
{ 
    secret_thing obj; 
    obj.revealing_method_name(); 
} 

अब मुझे क्या करना:

$ g++ unwanted.c -o unwanted 
$ strip unwanted 
$ nm unwanted | grep secret 
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv 
0000000100000eae T __ZN12secret_thingC1Ev 

अगर मैं बाहर विभाजित इंटरफ़ेस और गुप्त वर्ग का कार्यान्वयन, क्योंकि अधिकांश लोग सी ++ कोड लिखते समय करते हैं, फिर छीनने वाले निष्पादन योग्य में कोई अवांछित प्रतीक नहीं होते हैं। अफसोस की बात है, मुझे कोड की कई हज़ार लाइनों का मौजूदा कोड बेस सौंपा गया है और यह मेरे विकल्पों में से एक नहीं है।

मैं -fno-RTTI की कोशिश की है, एक जंगली अनुमान के रूप में, और कहा कि कुछ भी ठीक नहीं होती। मैंने Google देवताओं से प्रार्थना की है और क्लबों को स्ट्रिप करने के कई संदर्भ पाए हैं, लेकिन कोई उपयोगी लिंक नहीं है। मैं पट्टी के लिए आदमी पृष्ठों, जी ++ और पर मैक ld स्किम्ड है, और वहाँ कोई स्पष्ट बातें की कोशिश करने के लिए गए थे, हालांकि वाक्यांश "निजी externs" पेचीदा था, मैं इस बारे में क्या करना है यह पता लगाने नहीं कर सका।

[अद्यतन] दुख की बात है, वहाँ पता चला है एक छोटा सा उदाहरण बनाने के लिए मेरे प्रयास के साथ एक समस्या हो सकता है। यहां एक और जटिल उदाहरण है, जो वास्तविक समस्या के करीब है, जो अभी भी अवांछित प्रतीक हैं यदि इसे अनुकूलित बनाया गया है।

मुझे बुरा उदाहरण के लिए हमें खेद है। सबसे छोटी वास्तविक समस्या को ढूंढना मुश्किल हो जाता है। उत्तरों के लिए बहुत धन्यवाद, हालांकि, प्रत्येक उत्तर मुझे समाधान के करीब धक्का देता है।

class base { 
public: 
    virtual int revealing_method_name() = 0; 
    virtual ~base() {}; 
}; 

class secret_thing : public base { 
public: 
    int revealing_method_name() { return 0; }; 
}; 

class other_thing : public base { 
public: 
    int revealing_method_name() { return 1; }; 
}; 

int main(int argc, char**) 
{ 
    base *object = 0; 
    if(argc > 1) object = new secret_thing; 
    else object = new other_thing; 

    return object->revealing_method_name(); 
} 

उत्तर

8

मैं सफलतापूर्वक निष्पादन से प्रतीकों पट्टी निम्नलिखित संकलन सीमा का उपयोग करना है परिणाम:

$ nm executable 
       U __ZTVN10__cxxabiv117__class_type_infoE 
       U __ZTVN10__cxxabiv120__si_class_type_infoE 
       U __ZdlPv 
       U __Znwm 
       U ___cxa_pure_virtual 
       U ___gxx_personality_v0 
0000000100000000 A __mh_execute_header 
       U _exit 
       U dyld_stub_binder 
1

इस रूप में वांछित काम करने के लिए लगता है ...:

$ strip unwanted 
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove 
$ strip -R /tmp/remove unwanted 
+0

मेरे पास गलत कोड पोस्ट किया गया था। सही उदाहरण कोड के साथ, के रूप में सवाल अब पढ़ता है, वर्ग परिभाषा अंदर तरीकों के लिए कार्यान्वयन के साथ, पट्टी का कहना है: पट्टी: प्रतीकों अप्रत्यक्ष प्रतीक तालिका प्रविष्टियों द्वारा संदर्भित है कि में छीन नहीं किया जा सकता:/उपयोगकर्ताओं/माइकल। खिलौना/अवांछित __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy

+0

हालांकि उत्तर काफी उपयोगी था, क्योंकि यह मुझे और अधिक Google चारा देता था, कि त्रुटि स्ट्रिंग जांच के कुछ और दिलचस्प क्षेत्रों को प्रकट करती है। – mtoy

1

उदाहरण कोड द्वारा पोस्ट की गई, उन प्रतीकों में 'ओ' अनुकूलन झंडा परिणाम जोड़ने nm से प्रदर्शित नहीं हो देखते हुए संकलन के बाद।

+0

ने एक करीबी-से-वास्तविक-समस्या उदाहरण पोस्ट किया है जो अभी भी समस्या को प्रदर्शित करता है। मूल ऐप जो मुझे इस बिंदु पर ले गया था अनुकूलित किया गया था। उत्तर के लिए धन्यवाद। – mtoy

2

यह क्या तुम सच में निष्पादन पट्टी नहीं है, लेकिन इसके प्रतीक तालिका अंधेरा करना चाहता हूँ की तरह लगता है। मुझे यकीन नहीं है, लेकिन शायद this जैसे कुछ उपयोगी होंगे।

$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp 
$ strip executable 

नवीनतम नमूना फ़ाइल को देखते हुए इसे: कम से कम, "सी ++ प्रतीक तालिका अस्पष्टकर्ता" शायद एक बेहतर गूगल खोज स्ट्रिंग ..

+0

मैं वास्तव में निष्पादन योग्य छीनना चाहता हूं। हालांकि, यह शायद "बैकअप समाधान मुझे उम्मीद है कि मुझे कभी भी लागू करने की आवश्यकता नहीं है" शीर्षक के तहत नोटबुक में जाता है। यह ऊपर से चला जाता है "अपना खुद का पोस्ट प्रोसेसर लिखो जो लिंक करता है जो कभी भी अनलिंक होता है जिसे उन प्रतीकों की आवश्यकता होती है और फिर प्रतीकों को स्ट्रिप करती है" – mtoy

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