2013-02-14 60 views
6

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

मैं रिलीज कॉन्फ़िगरेशन का उपयोग करता हूं। प्रोजेक्ट गुणों में, लिंकर टैब के तहत "जेबेट डीबग जानकारी" विकल्प बंद कर दिया गया है, सी/सी ++ टैब के तहत "डीबग सूचना प्रारूप" को "प्रोग्राम डेटाबेस (/ जीआई)" पर सेट किया गया है। मैंने बिना किसी सफलता के "डीबग सूचना प्रारूप" के लिए खाली स्ट्रिंग सेट करने का प्रयास किया।

डीएल में पाया गया स्ट्रिंग [email protected]@ जैसा दिखता है और डीएलएल फ़ाइल के बहुत अंत में स्थित है। यह डीएलएल फ़ाइल में "सीएम क्लास" स्ट्रिंग का एकमात्र घटना है। हालांकि, यह स्ट्रिंग लगभग सभी मेरे आंतरिक वर्गों के लिए प्रस्तुत की जाती है।

इन उल्लेखों से कैसे छुटकारा पाएं?

अद्यतन

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

Update2

मैं, इस qustion बंद करने पर समुदाय के साथ सहमत नहीं हूँ के बाद से इस एक नकली नहीं है। और जवाब Tyler Gill द्वारा टिप्पणियों में दिया गया है। उनके लिए धन्यवाद और दूसरों पर शर्म की बात है।

+1

http://stackoverflow.com/questions/1025494/obfuscating-cc-code – Ram

+1

"मैं नहीं चाहता कि यह स्ट्रिंग डीएलएल फाइल में दिखाई दे" यह सही कारण है कि आप कक्षा का नाम क्यों सोचते हैं छुपाओ एक सी ++ कोड संकलन खुद में पर्याप्त obfuscation है! – Ram

+0

@ राम क्योंकि कक्षाओं के नाम एल्गोरिदम के नाम से मेल खाते हैं जो हम समस्या को हल करने के लिए उपयोग करते हैं। हम नहीं चाहते कि किसी को पता चले कि हम किस एल्गोरिदम का उपयोग करते हैं। – Mikhail

उत्तर

4

जैसा कि एक टिप्पणी से मेरा अनुमान सही दिखाई देता है, मैं इसे एक उत्तर के रूप में दोबारा पोस्ट कर रहा हूं।

कक्षा नाम की स्ट्रिंग संकलित बाइनरी के लिए आरटीटीआई (रनटाइम टाइप सूचना) सक्षम होने का परिणाम है। जब आरटीटीआई सक्षम होता है, तो कंपाइलर ऑब्जेक्ट बनाता है जो द्विआधारी में संकलित प्रकारों के बारे में जानकारी संग्रहीत करता है, जिनमें से एक गुण प्रकार का नाम है।

ध्यान दें कि dynamic_cast और typeid के कुछ उपयोग आरटीटीआई की आवश्यकता है, इसलिए अक्षम करने से आपको सी ++ की उन सुविधाओं की लागत होगी।

दृश्य स्टूडियो में RTTI को निष्क्रिय करने के लिए, का उपयोग /GR- स्विच (http://msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx देखते हैं, के रूप में मिखाइल तैनात।)

जीसीसी में उसे निष्क्रिय करने के लिए, -fno-rtti स्विच का उपयोग करें।

+1

वही किया और यह केवल कक्षा के नामों के लिए काम किया। दूसरों के लिए आरटीटीआई पर्याप्त नहीं था। स्पष्ट रूप से वर्चुअल फ़ंक्शंस के साथ "std :: bind" का उपयोग करते समय - आरटीटीआई अक्षम होने पर भी कक्षा का नाम बाइनरी में दिखाई दे सकता है। बस std :: bind (या संबंधित फ़ंक्शन) का उपयोग न करें –

2

टिप्पणियों में उल्लिखित Tyler Gill के रूप में, इस स्ट्रिंग को आरटीटीआई के कारण संकलक द्वारा छोड़ा गया था क्योंकि CMyClass वास्तव में IMyClass प्राप्त करता है और यह पॉलिमॉर्फिक है। /GR- स्विच के साथ मेरी समस्या आसानी से disabling RTTI द्वारा हल की जा सकती है। धन्यवाद।