我希望向我的客户发送一些组件。我想要发送源代码的原因是:
1)我的类是模板化的。客户可能使用任何模板参数,所以我无法预编译并发送.o文件。
2)客户可能使用不同于我的gcc编译器版本。因此我希望他在自己的环境中进行编译。
现在,出于明显的原因,我不能透露我的源代码。我最多只能透露.h文件。有什么办法可以实现这一点吗?我正在考虑一些钩子,支持在编译之前进行解密等操作。这是可能的吗?
简而言之,我希望他能够编译这段代码,同时又不能窥视其内部。
我希望向我的客户发送一些组件。我想要发送源代码的原因是:
1)我的类是模板化的。客户可能使用任何模板参数,所以我无法预编译并发送.o文件。
2)客户可能使用不同于我的gcc编译器版本。因此我希望他在自己的环境中进行编译。
现在,出于明显的原因,我不能透露我的源代码。我最多只能透露.h文件。有什么办法可以实现这一点吗?我正在考虑一些钩子,支持在编译之前进行解密等操作。这是可能的吗?
简而言之,我希望他能够编译这段代码,同时又不能窥视其内部。
合约=好,混淆=不好。
话虽如此,你总是可以使用一种PIMPL惯用语法为客户提供二进制文件和头文件中的模板包装器。其思想是使用一个“非类型化”的分别编译的实现,其中模板包装器仅为客户端代码提供类型安全性。在编译器开始理解如何优化模板之前,这通常是人们处理事物的方式,即避免机器码层面的代码膨胀,但它仅提供了一些保护措施,防止简单的复制和粘贴盗窃,而不是任何针对愿意深入研究机器代码的人的保护。
但也许这样做的工作量比重新发明功能还要大呢?
在Alf的回答中,只是加入了一些术语:你可能会看到Thin模板习惯。它基本上模拟了通用功能。不要被谷歌搜索出来的维基百科文章所混淆,您不必使用void*
...
当然,这并不能保证二进制兼容性。通常情况下,“本地”c++需要为客户平台自己编译组件并部署二进制文件,或者提供给他们您的代码...与纯通用组件代码的区别在于您可以完成前者。
使用一些C++混淆器可能会有所帮助: http://www.semdesigns.com/products/obfuscators/CppObfuscationExample.html
或者 Magle It
那么,你能在编译期间解密吗?只有在向他们提供为其特定系统构建的自己破解的GCC二进制文件时才可以,这可能比提供自己的库的不同版本更麻烦(尽管它可能解决模板/头文件曝光问题)。
或者,您可以使用源代码混淆技术。这可能是实际上最好的方法了。我不知道有哪些工具,但这是人们追求几十年的方法(尽管我还没有听说过有人推荐它),所以肯定有一些成熟的工具。
关于模板化代码-其他人建议将模板化前端用作预编译对象提供C风格的通用实现。这可能是可行的(明显存在性能下降的风险,并且您必须捕获要求的一组类型特定操作-例如通过从抽象操作基类派生出一个类型特定的类进行实例化),但无论如何,预编译对象仍然会遇到B的问题)。
另一个想法是...客户可能会拿走你的源代码,但不太可能像你一样理解它。即使他们构建更多依赖于其版本的系统,从某种意义上说,他们会变得更加被锁定,并且将来可能更需要你的服务。而且,如果你发现他们没有公平竞争,到时候你可以适当地向他们收费。看起来gcc 4.5支持插件。因此,您可以提供自己的.so文件,在编译阶段开始之前调用它。因此,您可以在其中拥有各种技巧(例如源文件解密),并且这些技巧被巧妙地隐藏。这也是可移植的解决方案,因为没有对g++本身进行任何更改。
这正是我一直在寻找的。您可以在此处阅读更多信息: http://www.codesynthesis.com/~boris/blog/2010/05/03/parsing-cxx-with-gcc-plugin-part-1/