Скрытие символов C ++ в статической библиотеке iOS? - PullRequest
1 голос
/ 04 ноября 2010

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

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

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

Ответы [ 5 ]

3 голосов
/ 05 ноября 2010

Решено!В конечном итоге я включил весь исходный код в один 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 голосов
/ 04 ноября 2010

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

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

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

0 голосов
/ 11 мая 2013

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

0 голосов
/ 10 мая 2013

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

0 голосов
/ 05 ноября 2010

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

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

...