我有一个专有应用程序,我想分发给几个人进行测试,但我们不想向他们透露来源。该应用程序是用 C++ 为 Linux 编写的。它链接到 Fedora/Ubuntu 存储库上现成的软件包。
有没有办法将源代码处理成中间的东西......然后分发它,并让用户进行最终编译,该编译实际上将中间代码编译并链接到他们的本机平台。
我正在尝试查看是否有任何替代分发预编译二进制文件的方法。谢谢。
我有一个专有应用程序,我想分发给几个人进行测试,但我们不想向他们透露来源。该应用程序是用 C++ 为 Linux 编写的。它链接到 Fedora/Ubuntu 存储库上现成的软件包。
有没有办法将源代码处理成中间的东西......然后分发它,并让用户进行最终编译,该编译实际上将中间代码编译并链接到他们的本机平台。
我正在尝试查看是否有任何替代分发预编译二进制文件的方法。谢谢。
这不是一个技术性的答案,但您是否足够信任他们以要求签署 NDA?
只需将其编译为汇编程序。可以使用 -S 选项来完成。
你好世界.cpp:
#include <iostream>
using namespace std;
int main(void)
{
cout << "Hello World" << endl;
return 0;
}
然后做:
emil@lanfear /home/emil/dev/assemblertest $ g++ -S -o helloworld.s helloworld.cpp
emil@lanfear /home/emil/dev/assemblertest $ g++ -o helloworld helloworld.s
emil@lanfear /home/emil/dev/assemblertest $ ./helloworld
Hello World
使用这种方法,您只能分发包含非常难以阅读的汇编程序的 .s 文件。
您可以处理现有的源代码以“破坏”它;基本上,这包括删除所有注释,将变量名更改为最小化,并删除所有源代码格式。问题是,他们可以相对容易地改回变量名并添加格式和注释;虽然他们不会在生成的源代码中拥有与您相同级别的信息,但他们将拥有完整的功能源代码(因为这是您分发给他们的内容)。这是做这种事情的唯一方法。
我能想出的最佳解决方案是限制您支持的平台数量并进行自己的编译,或者编译为难以从中提取信息的二进制格式,但用户可以将其编译为其本机格式。
我个人会选择选项1。
简而言之,没有。根据定义,如果他们可以编译它,那么他们就有你的源代码。你能做的最好的事情就是增加他们试图理解它的痛苦。
我同意约翰的观点。如果您有少量客户并信任他们,NDA 将是更好的途径。
我刚刚想到的另一件事......只运行预处理器和编译器,而不是汇编器和链接器呢?每个特定架构的汇编语言都需要一份副本,但我认为这会很痛苦,足以阻止编辑,同时又很容易编译。
您可以将您的应用程序分为两部分:第一部分将包含具有独立于操作系统功能的预编译库,第二部分将包含用户将编译的一小部分源代码。英伟达以这种方式分发他们的驱动程序。
您可以混淆您的 C/C++ 代码。请参阅我关于C/C++ 混淆工具的问题
如果是 C,您可以使用clang编译器,然后转储 LLVM 中间表示。如果是 C++,您可能需要等待一段时间,直到 clang 的 C++ 支持成熟。