2010-11-04 24 views
0

J'ai créé une bibliothèque de code iOS en C++ pur, que j'ai l'intention de publier à beaucoup de gens. Pour autant que je sache, au moment de l'écriture, la seule façon de partager du code compilé sur iOS est à travers une bibliothèque statique.Masquage des symboles C++ dans la bibliothèque statique iOS?

Malheureusement, il y a quelques bits intelligents dans le code que je voudrais cacher de la vue publique. Ce que je voudrais faire, c'est seulement exposer les symboles pour une seule classe d'interface (simple), et cacher tout le reste. Est-ce possible?

Toutes les autres idées sur la façon de cacher mes symboles sont également les bienvenues. Merci pour votre temps!

Répondre

2

Résolu! J'ai fini par tout d'abord y compris toute la source dans un seul cpp. Deuxièmement, j'ai mis tous les éléments non externes dans un espace de noms sans nom. Ensuite, pour se débarrasser des symboles restants j'ai ajouté ce script pour le processus de construction:

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

Quelles bandes tous les symboles globaux sauf MyGlobalFunctionToInstantiateMainClass.

2

Cela dépend de ce que vous considérez être une "vue publique".

Si le code est réparti sur plusieurs fichiers sources, vous n'avez généralement pas de chance si vous souhaitez masquer les symboles internes de l'éditeur de liens. Une bibliothèque statique est en réalité une archive de fichiers objets individuels, ils doivent donc tous être traités par l'éditeur de liens lors de la liaison de la bibliothèque à une application.
Si la bibliothèque est fortement basée sur un modèle, alors vous n'avez pas non plus de chance. Le compilateur du programme final doit être capable de voir tous les modèles pertinents, donc vous ne pouvez pas les cacher.
Si la bibliothèque se compose d'un fichier source unique, vous pouvez utiliser un espace de noms anonyme pour donner à tous les symboles internes un nom inexprimable tel qu'ils ne sont pas utilisables à toutes fins pratiques. Si vous craignez que les noms des symboles internes n'apprennent trop, alors n'utilisez pas ces noms descriptifs ou exécutez le code via un obfuscateur avant de créer une version.

+0

Merci, Bart! C'est comme je le soupçonnais. Un obfuscator de code fonctionnera si je peux l'intégrer joliment dans le processus de construction. Connaissez-vous de bons? – Simplex

0

J'ai trouvé que compiler tous les fichiers source en une seule unité de compilation en les incluant dans un fichier .cpp composite, et en mettant tout sauf une classe publique dans un espace de noms sans nom cache la plupart des symboles. Toutefois, les noms de méthodes en ligne et statiques apparaissent toujours dans la bibliothèque statique. Est-il un moyen d'empêcher cela?

0

La meilleure façon de résoudre un double symbole ou de se cacher consiste à obscurcir les sources c/C++.

0

Nous avons eu le même problème et a résolu le problème sans avoir à combiner tous notre code en un seul fichier source, voir la réponse que j'ai écrit ici pour une question connexe: https://stackoverflow.com/a/16492468/1086196