MacOs 10.6, wenn ich eine Datei "unwanted.c", die enthält:Wie man wirklich ein binäres in MacOs Streifen
class secret_thing {
public:
secret_thing() {}
void revealing_method_name() {}
};
main()
{
secret_thing obj;
obj.revealing_method_name();
}
Jetzt tue ich:
$ g++ unwanted.c -o unwanted
$ strip unwanted
$ nm unwanted | grep secret
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv
0000000100000eae T __ZN12secret_thingC1Ev
Wenn ich die aufzuschlüsseln Schnittstelle und Implementierung der geheimen Klasse, wie es die meisten Leute beim Schreiben von C++ - Code tun, dann gibt es keine unerwünschten Symbole in der entfernten ausführbaren Datei. Leider habe ich eine bestehende Codebasis von vielen tausend Codezeilen erhalten, und dies ist keine meiner Wahlmöglichkeiten.
Ich habe versucht-fno-rtti, wie eine wilde Vermutung, und das hat nichts behoben. Ich habe zu den Google-Göttern gebetet und viele Hinweise auf Strip-Clubs gefunden, aber keine hilfreichen Links. Ich habe die man-Seiten für Strip, g ++ und ld auf dem Mac überflogen, und es gab keine offensichtlichen Dinge, die ich ausprobieren konnte, obwohl der Ausdruck "private externs" faszinierend war, ich konnte nicht herausfinden, was ich dagegen tun sollte.
[update] Leider stellt sich heraus, ein Problem mit meinem Versuch, ein kleines Beispiel zu machen. Hier ist ein komplizierteres Beispiel, das näher an dem eigentlichen Problem ist, welches immer noch unerwünschte Symbole hat, wenn es optimiert aufgebaut ist.
Ich entschuldige mich für die schlechten Beispiele. Es erweist sich als schwierig, das kleinste tatsächliche Problem zu finden. Vielen Dank für die Antworten, aber jede Antwort bringt mich fast zu einer Lösung.
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();
}
Ich hatte den falschen Code gebucht. Mit dem richtigen Beispielcode, wie die Frage nun liest, mit der Implementierung für die Methoden INSIDE die Klassendefinition, sagt strip: strip: Symbole, die von indirekten Symboltabelleneinträgen referenziert werden, die nicht entfernt werden können:/Users/michael. Spielzeug/unerwünscht __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy
jedoch war die Antwort sehr nützlich, da es mir mehr Google-Futter gab, dass diese Fehlerkette einige interessantere Bereiche der Untersuchung enthüllt. – mtoy