Как избежать символов и исходных путей в бинарном iOS? - PullRequest
8 голосов
/ 17 ноября 2011

Когда я компилирую версию моего приложения для iOS (на основе стандартного шаблона приложения для iOS от Apple), просматриваю полученный исполняемый двоичный файл, я вижу все виды символов и даже локальный источник и заголовок cpp пути там. Я действительно озадачен, почему это так (я не включил RTTI *). Особенно из-за путей к исходным файлам я чувствую себя некомфортно, отправляя это приложение по всему миру (почему каждый должен видеть макет каталога моей машины для разработки?).

Вот два (случайно выбранных, модерированных) выдержки:

TS/../ACTORS/CActorCanvasCharPart.cpplastMeshcapVerticesOFF BOUNDSupload VERTICES: %d 20CActorCanvasCharPartgrassscrub/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_grass.cppbaseShadowmowerstartmowerloopmowermowerCharcutGrassChargrassStuffgrassParticles/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_grass.h17CStateGame2_grasssinwriteStroke/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_flowers.hflowerBedsandTrailclickstart3inplace2sandDrag/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame

А вот множество символов для самоопределенных типов и структур:

CAssetMgr="_vptr$CMgrBase"^^?"pMain"^{CMain}"inited"B"curveCount"S"curveSpecs"^{CCurveSpec}"gameSpecs"[23{CGameStateSpec="header"{SpecDiskHeader="type"i"version"S}"gameID"C"backgroundColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"clickPointColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"clickPointIconColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"hintColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}}]"currentFont"^{CCharset}"userCharParts"^^{CCharPart}"words"{CDataSet<CName4,CCharArray>="_vptr$CObjectBase"^^?"pMain"^{CMain}"count"i"data"*"dataSize"l}"sets"{CDataSet<CName16,CCharArray>="_vptr$CObjectBase"^^?"pMain"^{CMain}"count"i"data"*"dataSize"l

Можно ли этого избежать, как?

* ОБНОВЛЕНИЕ: Я только что узнал, что RTTI включен по умолчанию. Поэтому я очистил цель, отключил RTTI (GCC_ENABLE_CPP_RTTI = NO) и перекомпилировал. Я до сих пор вижу много символов и исходных путей в двоичном файле.

ОБНОВЛЕНИЕ 2: я проверил несколько других приложений из магазина приложений, и у многих из них также отображаются пути к исходным файлам. Довольно страшно, если вы спросите меня:

Joined Up Lite<br> /Users/lloydy/Documents/Development/iPhone/ABC Joined Up/main.m<br> /Users/lloydy/Documents/Development/iPhone/ABC Joined Up/Classes/SettingsView.m

Crayon Physics<br> /Users/smproot/Desktop/unzip/CrayonPhysics/v104/Classes/crayon/src/ceng/gameutils/killspriteslowly/killspriteslowly.cpp<br> /Users/smproot/Desktop/unzip/CrayonPhysics/v104/Classes/crayon/src/ceng/tasks/task/sdl/mixer/ctaskaudiosdlmixer.cpp

Wall Times<br> /Users/fred/_WORK/ZDNDRP/WallTimes/main.m<br> /Users/fred/_WORK/ZDNDRP/WallTimes/Classes/SystemCategories.m

Jumbo Calculator<br> /Users/Christopher/Documents/Development/JumboCalculator 1.0.3/main.m<br> /Users/Christopher/Documents/Development/JumboCalculator 1.0.3/Classes/CalculatorFaceViewController.m

Ответы [ 4 ]

6 голосов
/ 12 февраля 2012

Пути к файлам, скорее всего, взяты из макросов assert, которые приводят к __FILE__ как части сообщения об ошибке. Реализация assert(3) в iOS делает то же самое, что и макросы NSAssert.

Вы можете удалить утверждения в сборках выпуска, определив NDEBUG (для утверждений C) и NS_BLOCK_ASSERTIONS (для NSAsserts).

5 голосов
/ 30 июня 2012

В Xcode установите для Deployment Prostprocessing значение Yes, чтобы Xcode вызывал команду strip во время процесса сборки.Тогда вы не видите пути к исходному тексту с помощью nm -a.

Однако я по-прежнему вижу исходные пути некоторых m файлов с помощью команды strings: /

3 голосов
/ 14 января 2016

Что мне помогло, так это установить Generate Debug Symbols в No для релизных сборок.Это под Apple LLVM 7.0 - Code Generation в Xcode 7.2.

1 голос
/ 17 ноября 2011

Отметили ли символы отладки полосы в настройках сборки?Вы можете сделать это (или нет) в зависимости от конфигурации (сборка / выпуск).Также вы можете посмотреть на Objective-C Code Obfuscation (который давно сложен).Из того, что я понял, вы не можете полностью удалить информацию target-c, поскольку все вызовы методов выполняются динамически, поэтому библиотека должна иметь информацию о ваших именах классов / методов, чтобы функционировать.Полезный совет здесь .

Если у вас есть код на C ++, вы можете использовать утилиту gcc strip , хотя я не уверен, как она похожа на Objetive-C ++,если это не так, вы можете скомпилировать все свои cpp в lib, убрать их и связать с ними в своем проекте iOS.

...