我希望向客户发送一些组件。我想提供源代码的原因是:
1)我的班级是模板化的。客户可能使用任何模板参数,因此我无法预编译并发送.o文件。
2)客户可能对gcc使用不同的编译器版本而不是我的。所以我希望他在他的最后编辑。
现在,由于显而易见的原因,我无法透露我的源代码。我能做的最大化就是显示.h文件。任何想法我怎么可能实现这一点。我正在考虑gcc中的一些钩子,它们在编译之前支持解密等等。这可能吗?
简而言之,我希望他能够编译这段代码而无法窥探内部。
答案 0 :(得分:11)
合同=好,混淆= ungood。
也就是说,你总是可以做一种PIMPL习惯用来为你的客户提供二进制文件和标题中的模板包装器。然后,我们的想法是使用“无类型”单独编译的实现,其中模板化的包装器只为客户端代码提供类型安全性。这就是在编译器开始理解如何优化模板之前经常做的事情,也就是说,为了避免机器代码级代码膨胀,但它只提供了一些关于琐碎的复制和粘贴盗窃的保护措施,而不是任何针对某人的保护愿意深入研究机器代码。
但也许这种努力不仅仅是重塑你的功能?
答案 1 :(得分:5)
只需在Alf的答案中添加一些术语:精简模板习惯用法就是您可能会看到的内容。它基本上模拟了泛型的功能。不要被谷歌弹出的维基百科文章搞糊涂,你不必使用void*
......
当然,这并不能保证二进制兼容性。像往常一样使用'native'c ++,你可以自己为客户平台编译组件并部署二进制文件,或者给他们你的代码......纯通用组件代码的不同之处在于你可以完成前者。
答案 2 :(得分:4)
使用一些c ++混淆器可能有帮助吗?:http://www.semdesigns.com/products/obfuscators/CppObfuscationExample.html
或Magle It
答案 3 :(得分:3)
首先,如果您要提供源代码,那么您必须提供源代码。当然,你可以加密它,但即使GCC有“编译前解密”选项,它也需要解密代码,如果GCC可以解密代码,那么你的客户也可以。
你问的是不可能的。 (如果你找到了一种方法,我相信电影行业可能会为你提供数百万的合约。他们目前不得不使用昂贵的定制硬件来防止人们破坏内容,而这只能在有限的程度上起作用)
至于你的“显而易见的原因”,为什么你不想提供源代码,我不明白为什么它们是显而易见的。如果您提供源代码会发生什么?
您有两种选择:
答案 4 :(得分:1)
pimpl s怎么办?
答案 5 :(得分:1)
1)我的班级是模板化的。客户可能使用任何模板参数,因此我无法预编译并发送.o文件。
2)客户可能对gcc使用不同的编译器版本而不是我的。所以我希望他在他的最后编辑。
现在,由于显而易见的原因,我无法透露我的源代码。我能做的最大化就是显示.h文件。任何想法我怎么可能实现这一点。我正在考虑gcc中的一些钩子,它们在编译之前支持解密等等。这可能吗?
简而言之,我希望他能够编译这段代码而无法窥探内部。
上述考虑2)包括A)ABI差异,使得在同一平台上使用不同编译器版本/供应商编译的相同代码是不兼容的,以及B)系统库,内核版本等的差异,代码可能要依赖。唯一的通用解决方案是在特定平台上进行编译。您可以为所有平台执行此操作,也可以为其提供所有源代码并执行此操作。这不仅仅是标题和模板实现,这也是你的外部函数。你可以通过构建一个更具互操作性的外部“C”函数的墙来缓解A),但是当涉及到B)时你基本上被卡住了。
那么,您可以在编译期间解密吗?只有当您将自己的黑客GCC二进制文件发送给它们时,才为它们的特定系统构建,这可能比提供自己库的不同版本更麻烦(尽管它可能解决模板/标题暴露问题)。
或者,您可以使用源代码混淆技术。这可能 - 实际上 - 和它一样好。我不知道那里有什么工具,但这是人们追求数十年的方法(虽然我还没有听到有人推荐它),所以肯定会有一些成熟的工具。
重新模板化的代码 - 其他人建议将模板化的前端作为预编译对象提供给C风格的通用实现。这可能是也可能不实用(显然存在性能下降的风险,并且您必须捕获所需的特定于类型的操作集 - 例如,通过实例化从抽象操作基类派生的特定于类型的类)但是仍然预编译的对象仍然存在与B)发生冲突。
另一个想法......客户可能会采用您的源代码,但不太可能像您一样理解它。即使他们构建了更多依赖于其版本的系统,他们也会越来越多地锁定,并且可能在将来对您的服务有更多需求。而且,如果你发现他们没有公平竞争,你会在适当的时候给他们充电。
答案 6 :(得分:0)
似乎gcc 4.5支持插件。因此,您可以提供自己的.so,例如,在编译阶段开始之前调用它。所以你可以在那里拥有各种技巧(解密源文件),整齐地隐藏起来。这也是便携式解决方案,因为g ++本身没有变化。
这正是我想要的。你可以在这里阅读更多: http://www.codesynthesis.com/~boris/blog/2010/05/03/parsing-cxx-with-gcc-plugin-part-1/