2009-07-16 10 views
9

को प्रकट किए बिना संकलित कर सकें, मेरे पास एक स्वामित्व एप्लिकेशन है जिसे मैं परीक्षण के लिए कुछ लोगों को सौंपना चाहता हूं, सिवाय इसके कि हम उन्हें स्रोत प्रकट नहीं करना चाहते हैं। आवेदन लिनक्स के लिए सी ++ में लिखा गया है। यह Fedora/Ubuntu repos पर आसानी से उपलब्ध संकुल के खिलाफ लिंक करता है।जनता को एक एप्लिकेशन वितरित करें ताकि वे स्रोत

स्रोत को कुछ मध्यवर्ती करने के लिए स्रोत को संसाधित करने का कोई तरीका है ... फिर इसे वितरित करें, और उपयोगकर्ता अंतिम संकलन करते हैं जो वास्तव में मध्यवर्ती कोड को उनके मूल मंच पर संकलित और लिंक करता है।

मैं यह देखने की कोशिश कर रहा हूं कि प्रीकंपील्ड बाइनरी वितरित करने का कोई विकल्प है या नहीं। धन्यवाद।

+0

साथ जाना होगा मैं एक बहुत ही इसी तरह के सवाल http://stackoverflow.com/questions/1025494/obfuscating-c-c-code – hhafez

+0

प्रेरणा क्या है था? क्या कोई विशेष कारण है कि उन्हें स्रोत देखने की अनुमति क्यों नहीं दी जा सकती है? और precompiled बाइनरी वितरित नहीं करना चाहते हैं के लिए क्या कारण है? – jalf

उत्तर

4

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

+1

इसे "झुका हुआ स्रोत" कहा जाता है और यह उदाहरण के लिए बहुत आम था यूनिक्स सॉफ्टवेयर। – tialaramex

+0

क्या आप इससे डीबगिंग जानकारी भी नहीं हटा सकते थे, या यही वह है जिसका आप जिक्र कर रहे हैं? – jkeys

+0

नहीं, जब आप स्रोत कोड (यहां तक ​​कि उलझन स्रोत कोड) वितरित कर रहे हैं तो आप डिबगिंग जानकारी को पूर्व-स्ट्रिप नहीं कर सकते हैं। डिबगिंग जानकारी तब तक नहीं बनाई जाती जब तक बाइनरी संकलित नहीं हो जाती। –

0

यदि यह सी है, तो आप clang कंपाइलर का उपयोग कर सकते हैं, फिर एलएलवीएम इंटरमीडिएट प्रतिनिधित्व को डंप कर सकते हैं। यदि यह सी ++ है, तो आपको क्लैंग के सी ++ समर्थन परिपक्व होने तक थोड़ी देर इंतजार करना पड़ सकता है।

+0

एलएलवीएम इंटरमीडिएट प्रतिनिधित्व पहले ही संकलित हो चुका है, और इस प्रकार कोई भी बिल्ड-टाइम परिवर्तन (उदाहरण के लिए किसी व्यक्ति से एक व्यक्ति प्रणाली पर संरचना का अलग-अलग आकार) परिणामस्वरूप द्विआधारी में दिखाई नहीं देगा। तो यह आमतौर पर केवल उन मामलों में काम करेगा जहां द्विआधारी वितरण करना उतना ही प्रभावी होगा। – tialaramex

+0

एकमात्र लक्ष्य मानना ​​है कि इसे अन्य प्लेटफॉर्म पर पोर्टेबल बनाना है, यह काफी अच्छा है, है ना? – bdonlan

+1

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

5

यह तकनीकी जवाब नहीं है, लेकिन क्या आप उन पर भरोसा करते हैं जो सिर्फ एक हस्ताक्षरित एनडीए मांगने के लिए पर्याप्त हैं?

+1

गेम डेवलपर्स ऑनलाइन बीटा के साथ ऐसा करते हैं, लेकिन यह उच्च जोखिम/उच्च इनाम है। – jkeys

5

बस इसे असेंबलर में संकलित करें। -एस विकल्प का उपयोग कर किया जा सकता है।

helloworld.cpp:

#include <iostream> 

using namespace std; 

int main(void) 
{ 
    cout << "Hello World" << endl; 
    return 0; 
} 

और फिर कार्य करें:

[email protected] /home/emil/dev/assemblertest $ g++ -S -o helloworld.s helloworld.cpp 
[email protected] /home/emil/dev/assemblertest $ g++ -o helloworld helloworld.s 
[email protected] /home/emil/dev/assemblertest $ ./helloworld 
Hello World 

इस प्रक्रिया में केवल .s-फ़ाइलें जो बहुत मुश्किल में शामिल होंगे कोडांतरक पढ़ने के लिए वितरित कर सकते हैं का उपयोग करना।

+1

यह "देशी प्लेटफ़ॉर्म" समस्या को हल नहीं करता है, क्योंकि यह मशीन-निर्भर (और संभावित रूप से डिस्ट्रो-निर्भर है, जो शीर्षलेख शामिल हैं) के आधार पर। –

+2

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

+1

भले ही यह प्लेटफॉर्म पर निर्भर है, वहां पर इतने सारे प्लेटफ़ॉर्म नहीं हैं - आप अधिकतर रुचि के सभी प्लेटफ़ॉर्म के लिए इसे अलग-अलग कर सकते हैं। – sharptooth

1

संक्षेप में, नहीं। परिभाषा के अनुसार यदि वे इसे संकलित कर सकते हैं तो उनके पास आपका स्रोत है। सबसे अच्छा आप इसे समझने की कोशिश कर रहे दर्द का दर्द बढ़ा सकते हैं।

मैं जॉन से सहमत हूं। यदि आपके पास छोटी संख्या में ग्राहक हैं और उन पर भरोसा है, तो एनडीए बेहतर मार्ग होगा।

एक और चीज जिसे मैंने अभी सोचा था ... केवल प्रीप्रोसेसर और कंपाइलर चलाने के बारे में क्या, लेकिन असेंबलर और लिंकर नहीं? आपको प्रत्येक विशिष्ट आर्किटेक्चर की असेंबली भाषा के लिए एक प्रति की आवश्यकता होगी, लेकिन मुझे लगता है कि संकलन करने के लिए पर्याप्त आसान संपादन के दौरान संपादन को दूर करने के लिए पर्याप्त दर्दनाक होगा।

1

आप अपने आवेदन को दो हिस्सों में विभाजित कर सकते हैं: पहले भाग में ओएस स्वतंत्र कार्यक्षमता वाले प्रीकंपिल्ड लाइब्रेरी होंगे, और दूसरे में स्रोतों के कुछ हिस्सों को शामिल किया जाएगा जो उपयोगकर्ता संकलित करेंगे। इस तरह एनवीआईडीआईए अपने ड्राइवरों को वितरित करता है।

0

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

व्यक्तिगत तौर पर मैं विकल्प 1.

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