2010-11-04 3 views
0

Я создал библиотеку кода iOS в чистом C++, который я намерен публиковать для многих людей. Насколько мне известно, на момент написания статьи единственным способом обмена скомпилированным кодом на iOS является статическая библиотека.Скрытие символов C++ в статической библиотеке iOS?

К сожалению, в коде есть некоторые умные биты, которые я хотел бы скрыть от общедоступного. То, что я хотел бы сделать, это разоблачить символы только для одного (простого) класса интерфейса и скрыть все остальное. Это возможно?

Любые другие идеи о том, как скрыть свои символы, также очень приветствуются. Спасибо за ваше время!

ответ

2

Решено! В итоге я в первую очередь включил весь источник в один cpp. Во-вторых, я помещал все не внешние элементы в неназванное пространство имен. Тогда, чтобы избавиться от оставшихся символов я добавил этот сценарий в процессе сборки:

echo MyGlobalFunctionToInstantiateMainClass > "${BUILT_PRODUCTS_DIR}/save_symbols" 
strip -s "${BUILT_PRODUCTS_DIR}/save_symbols" -u "${BUILT_PRODUCTS_DIR}/lib${PRODUCT_NAME}.a" 

Какие удаляет все глобальные символы, кроме MyGlobalFunctionToInstantiateMainClass.

2

Это зависит от того, что вы считаете «общедоступным».

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

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

+0

Спасибо, Барт! Это, как я подозревал. Обфускатор кода будет работать, если я могу хорошо его интегрировать в процесс сборки. Знаете ли вы хороших? – Simplex

0

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

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

0

Лучший способ разрешить дублирующийся символ или скрытие - обфускать источники c/C++.

0

У нас была такая же проблема и решить ее без необходимости объединить все наш код в один исходный файл, смотрите ответ я написал здесь связанный с этим вопрос: https://stackoverflow.com/a/16492468/1086196

Смежные вопросы