MacOs 10.6, si j'ai un fichier "unwanted.c" qui contient:Comment enlever vraiment un binaire MacOs
class secret_thing {
public:
secret_thing() {}
void revealing_method_name() {}
};
main()
{
secret_thing obj;
obj.revealing_method_name();
}
Maintenant, je fais:
$ g++ unwanted.c -o unwanted
$ strip unwanted
$ nm unwanted | grep secret
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv
0000000100000eae T __ZN12secret_thingC1Ev
Si je partage la interface et l'implémentation de la classe secrète, comme le font la plupart des gens lors de l'écriture de code C++, il n'y a pas de symboles indésirables dans l'exécutable dépouillé. Malheureusement, je reçois une base de code existante de plusieurs milliers de lignes de code et ce n'est pas un de mes choix.
J'ai essayé -fno-rtti, comme une supposition sauvage, et cela n'a rien arrangé. J'ai prié les dieux de Google et trouvé de nombreuses références à des clubs de strip-tease, mais pas de liens utiles. J'ai parcouru les pages man pour strip, g ++ et ld sur le mac, et il n'y avait pas de choses évidentes à essayer, même si l'expression "external externs" était intrigante, je ne savais pas quoi faire à ce sujet.
[mise à jour] Malheureusement, il y a un problème avec ma tentative d'en faire un petit exemple. Voici un exemple plus compliqué, qui est plus proche de ce qu'est le vrai problème, qui a toujours des symboles non désirés s'il est construit optimisé.
Je m'excuse pour les mauvais exemples. Il s'avère difficile de trouver le plus petit problème réel. Merci beaucoup pour les réponses, cependant, chaque réponse me rapproche d'une solution.
class base {
public:
virtual int revealing_method_name() = 0;
virtual ~base() {};
};
class secret_thing : public base {
public:
int revealing_method_name() { return 0; };
};
class other_thing : public base {
public:
int revealing_method_name() { return 1; };
};
int main(int argc, char**)
{
base *object = 0;
if(argc > 1) object = new secret_thing;
else object = new other_thing;
return object->revealing_method_name();
}
J'ai eu le mauvais code affiché. Avec le code d'exemple correct, comme la question maintenant, avec l'implémentation pour les méthodes à l'intérieur de la définition de classe, strip dit: strip: symboles référencés par des entrées de table de symboles indirectes qui ne peuvent pas être supprimées:/Users/michael. jouet/indésirable __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy
Cependant, la réponse a été très utile, car elle m'a donné plus de google, cette chaîne d'erreur révèle des domaines d'investigation plus intéressants. – mtoy