9

ソースを公開したくない場合を除いて、テストのために数人に配布したいプロプライエタリなアプリケーションがあります。このアプリケーションは、Linux 用の C++ で作成されています。Fedora/Ubuntu リポジトリですぐに利用できるパッケージにリンクしています。

ソースを中間のものに処理する方法はありますか...それを配布し、実際に中間コードをコンパイルしてネイティブプラットフォームにリンクする最終コンパイルをユーザーに行わせます。

コンパイル済みのバイナリを配布する以外に方法がないかどうかを調べています。ありがとう。

4

8 に答える 8

5

技術的な回答ではありませんが、署名済みの NDA を要求するほど信頼できますか?

于 2009-07-16T00:57:19.960 に答える
5

アセンブラにコンパイルするだけです。-S オプションを使用して実行できます。

helloworld.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 ファイルのみを配布できます。

于 2009-07-16T01:00:02.473 に答える
4

既存のソース コードを処理して「マングル」することができます。基本的に、これはすべてのコメントを削除し、変数名を最小限に変更し、すべてのソース コードの書式を削除することで構成されます。問題は、比較的簡単に変数名を元に戻したり、フォーマットやコメントを追加したりできることです。結果として得られるソース コードには、あなたと同じレベルの情報はありませんが、完全に機能するソース コードが含まれます (それがあなたが配布したものだからです)。これは、この種のことを行う唯一の方法です。

于 2009-07-16T00:50:23.733 に答える
1

アプリケーションを 2 つの部分に分割できます。最初の部分には、OS に依存しない機能を備えたプリコンパイル済みライブラリが含まれ、2 番目の部分には、ユーザーがコンパイルするソースの小さな部分が含まれます。このようにして、NVIDIA はドライバーを配布します。

于 2009-07-16T03:06:36.290 に答える
1

要するに、いいえ。定義上、彼らがそれをコンパイルできれば、彼らはあなたのソースを手に入れます。あなたができる最善のことは、彼らがそれを理解しようとする苦痛を増やすことです.

私はジョンに同意します。クライアントの数が少なく、信頼できる場合は、NDA の方が適しています。

私が考えたもう 1 つのことは、プリプロセッサとコンパイラのみを実行し、アセンブラとリンカを実行しない場合はどうでしょうか。特定のアーキテクチャのアセンブリ言語ごとにコピーが必要になりますが、コンパイルするのは簡単ですが、編集を思いとどまらせるのに十分な苦痛を伴うと思います。

于 2009-07-16T01:01:47.263 に答える
1

C/C++ コードを難読化できます。C/C++難読化ツールに関する私の質問を参照してください

于 2009-07-16T04:26:53.463 に答える
1

私が思いつく最善の解決策は、サポートするプラットフォームの数を制限して独自のコンパイルを行うか、情報を抽出するのが難しいバイナリ形式にコンパイルすることですが、ユーザーはこれをネイティブ形式にコンパイルできます。

個人的には、オプション 1 を使用します。

于 2009-08-08T09:53:24.743 に答える
0

C の場合は、clangコンパイラを使用して、LLVM 中間表現をダンプできます。C++ の場合、clang の C++ サポートが成熟するまでしばらく待つ必要があるかもしれません。

于 2009-07-16T00:52:47.587 に答える