2011-04-08 2 views
3

J'utilise le apple gcc pour compiler un dylib que je vais redistribuer. Pour diverses raisons, j'utilise des bibliothèques, disons libz pour simplifier les choses.Évitez les liens dans les symboles inutilisés lors de la liaison avec les bibliothèques statiques

Étant donné que cette bibliothèque ne se trouve généralement pas sur un système Mac, je souhaite utiliser les symboles static link in dans le dylib en transmettant le chemin au .a-file pour simplifier le déploiement.

Maintenant, le lieur lie en tous les symboles de la lib dans le dylib résultant bien que je ne fasse référence qu'à un sous-ensemble. Sur linux je n'ai jamais rencontré ce problème, l'éditeur de liens rejette heureusement tous les symboles non référencés et crée un exécutable très mince, il devrait donc être possible. Le fichier dylib que j'ai maintenant est ~ 10 fois plus grand que ce qu'il devrait.

J'ai essayé de bidouiller avec le drapeau d'éditeur -dead_code, mais en vain. Peut-être que je ne comprends tout simplement pas?

Est-ce que quelqu'un connaît la solution?

Répondre

5

Try -Wl,--gc-sections.

En ce qui concerne -dead_strip (ce que vous vouliez probablement dire par -dead_code):

Avant de mettre l'option -dead_strip votre projet devra d'abord être « porté » à travailler avec le code mort de décapage. Ceci inclura le changement de -gused (la valeur par défaut pour -g) à -gfull et la recompilation de tous les fichiers objets liés dans votre programme avec le nouveau compilateur de la version Mac OS X June 2004. Aussi, si votre bâtiment un exécutable qui se charge plugins, qui utilise des symboles de l'exécutable , vous devez vous assurer les symboles les plug-ins utilisent ne sont pas dépouillé (en utilisant attribut ((utilisé)) ou -exported_symbols_list option). Si vous utilisez une liste d'exportation et que vous créez une bibliothèque partagée ou un exécutable qui sera utilisé avec le drapeau -bundle_loader de ld (1), vous devez inclure les symboles d'exception dans la liste d'exportation pour vos symboles C++ exportés. Ces symboles se terminent par .eh et peuvent être vus avec l'outil nm (1).

and:

Pour activer le code mort décapage de la ligne de commande , passer l'option -dead_strip à ld. Vous devez également passer l'option -gfull à GCC pour générer un jeu complet de symboles de débogage pour votre code. L'éditeur de liens utilise cette information de débogage supplémentaire pour supprimer le fichier exécutable .

Espérons que cela aide.

Tout le contenu de cette réponse a été trouvé parmi les premiers résultats de recherche Google pour "apple ld static link unused symbols". :)

+0

merci de google up this. Compiler sur mac yeilds Les objets "Mach-O" contrairement à ELF que je crois sont utilisés avec le commutateur '--gc-sections'. J'ai essayé le commutateur '-gfull' avec le' -dead_strip' mais en vain. – vidstige

Questions connexes