Распространите приложение для всех, чтобы они могли компилироваться, не раскрывая источник - PullRequest
9 голосов
/ 16 июля 2009

У меня есть проприетарное приложение, которое я хотел бы раздать нескольким людям для тестирования, за исключением того, что мы не хотим раскрывать им источник. Приложение написано на C ++ для Linux. Он ссылается на легкодоступные пакеты в репозиториях Fedora / Ubuntu.

Есть ли способ обработать исходный код до чего-то промежуточного ... затем распространить его и заставить пользователей выполнить окончательную компиляцию, которая фактически компилирует и связывает промежуточный код с их собственной платформой.

Я пытаюсь выяснить, есть ли альтернатива распространению скомпилированных двоичных файлов. Благодарю.

Ответы [ 8 ]

5 голосов
/ 16 июля 2009

Просто скомпилируйте его на ассемблере. Может быть сделано с помощью опции -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-файлы, которые будут содержать очень трудно читаемый ассемблер.

5 голосов
/ 16 июля 2009

Это не технический ответ, но вы достаточно доверяете им, чтобы просто попросить подписанный NDA?

4 голосов
/ 16 июля 2009

Вы можете обработать существующий исходный код, чтобы "исказить" его; в основном это состоит из удаления всех комментариев, изменения имен переменных на минимальные и удаления всего форматирования исходного кода. Проблема в том, что они могут относительно легко изменить имена переменных назад и добавить форматирование и комментарии; хотя они не будут иметь такой же уровень информации в результирующем исходном коде, как вы, они будут иметь полностью функциональный исходный код (потому что именно это вы им и передали) Это единственный способ сделать что-то подобное.

1 голос
/ 16 июля 2009

Вы можете запутать свой код C / C ++. Смотрите мой вопрос для C / C ++ инструментов для запутывания

1 голос
/ 16 июля 2009

Вы можете разделить ваше приложение на две части: первая часть будет содержать предварительно скомпилированные библиотеки с независимой функциональностью ОС, а вторая будет содержать небольшие части исходных текстов, которые пользователи будут компилировать. Таким образом, NVIDIA распространяет свои драйверы.

1 голос
/ 16 июля 2009

Короче, нет. По определению, если они могут его скомпилировать, то у них есть ваш источник. Лучшее, что вы можете сделать, это усилить боль, которую они пытаются понять.

Я согласен с Джоном. Если у вас есть небольшое количество клиентов и вы им доверяете, NDA будет лучшим путем.

Еще одна вещь, о которой я только что подумал ... как насчет запуска препроцессора и компилятора, но не ассемблера и компоновщика? Вам понадобится копия для каждого языка ассемблера каждой конкретной архитектуры, но я предполагаю, что это будет достаточно болезненно, чтобы отговорить редактирование и достаточно легко будет скомпилировать.

0 голосов
/ 08 августа 2009

Лучшее решение, которое я могу придумать, - это ограничить число поддерживаемых вами платформ и делать свои собственные компиляции, или скомпилировать в двоичный формат, из которого трудно извлечь информацию, но пользователь может скомпилировать его в свой родной формат. формат.

Лично я бы выбрал вариант 1.

0 голосов
/ 16 июля 2009

Если это C, вы можете использовать компилятор clang , а затем вывести промежуточное представление LLVM. Если это C ++, вам может понадобиться немного подождать, пока поддержка Clang C ++ не станет зрелой.

...