MacOs 10.6, se ho un file "unwanted.c", che contiene:Come mettere a nudo davvero un binario in MacOs
class secret_thing {
public:
secret_thing() {}
void revealing_method_name() {}
};
main()
{
secret_thing obj;
obj.revealing_method_name();
}
Ora faccio:
$ g++ unwanted.c -o unwanted
$ strip unwanted
$ nm unwanted | grep secret
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv
0000000100000eae T __ZN12secret_thingC1Ev
Se ho diviso il interfaccia e implementazione della classe segreta, come la maggior parte delle persone quando scrivono il codice C++, quindi non ci sono simboli indesiderati nell'eseguibile spogliato. Purtroppo, mi viene consegnato un codice esistente di molte migliaia di righe di codice e questa non è una delle mie scelte.
Ho provato -fno-rtti, come ipotesi selvaggia, e questo non ha risolto nulla. Ho pregato gli dei di Google e ho trovato molti riferimenti agli strip club, ma nessun link utile. Ho sfogliato le pagine man per strip, g ++ e ld sul mac, e non c'erano cose ovvie da provare, anche se la frase "externs privati" era intrigante, non riuscivo a capire cosa fare al riguardo.
[aggiornamento] Purtroppo, si è verificato un problema con il mio tentativo di fare un piccolo esempio. Ecco un esempio più complicato, che è più vicino a quale sia il vero problema, che presenta ancora simboli indesiderati se è stato ottimizzato.
Mi scuso per gli esempi negativi. Risulta difficile trovare il problema più piccolo. Molte grazie per le risposte, però, ogni risposta mi spinge vicino a una soluzione.
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();
}
Ho ricevuto il codice errato. Con il codice di esempio corretto, come la domanda ora legge, con l'implementazione per i metodi INSIDE la definizione della classe, strip dice: strip: simboli a cui fanno riferimento voci di tabelle di simboli indiretti che non possono essere rimosse in:/Users/michael. giocattolo/indesiderato __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy
tuttavia la risposta è stata abbastanza utile, in quanto mi ha dato più foraggio google, quella stringa di errore rivela alcune aree di indagine più interessanti. – mtoy