2009-12-19 7 views
7

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(); 
} 

Antwort

8

die folgende Kompilierung Linie Mit erfolgreich Streife I die Symbole aus der ausführbaren Datei:

$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp 
$ strip executable 

die neueste Beispieldatei gegeben, diese Ergebnisse in:

$ nm executable 
       U __ZTVN10__cxxabiv117__class_type_infoE 
       U __ZTVN10__cxxabiv120__si_class_type_infoE 
       U __ZdlPv 
       U __Znwm 
       U ___cxa_pure_virtual 
       U ___gxx_personality_v0 
0000000100000000 A __mh_execute_header 
       U _exit 
       U dyld_stub_binder 
1

Diese wie gewünscht zu funktionieren scheint ...:

$ strip unwanted 
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove 
$ strip -R /tmp/remove unwanted 
+0

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

+0

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

1

den Beispielcode Sie gepostet haben gegeben, das Hinzufügen der Optimierung Flagge Ergebnisse in diesen Symbolen ‚-O‘ nicht durch nm gezeigt werden nach der Kompilierung.

+0

Habe ein näher am eigentlichen Problemfall liegendes Beispiel gepostet, das immer noch das Problem aufweist. Die ursprüngliche App, die mich an diesen Punkt gebracht hat, wurde optimiert aufgebaut. Danke für die Antwort. – mtoy

2

Es klingt wie, was Sie wirklich wollen, ist nicht die ausführbare Datei zu strippen, sondern ihre Symboltabelle zu verschleiern. Ich bin mir nicht sicher, aber vielleicht wäre so etwas wie this hilfreich. Zumindest „C++ Symboltabelle obfuscator“ ist wahrscheinlich ein besseres Google-Such Zeichenfolge ..

+0

Ich möchte wirklich die ausführbare Datei entfernt. Das geht aber wahrscheinlich im Heft unter der Überschrift "Backup-Lösungen, die ich hoffentlich nie umsetzen muss". Es geht direkt über "schreibe meinen eigenen Postprozessor, der verbindet, was auch immer nicht verknüpft ist, das diese Symbole benötigt und dann die Symbole entfernt" – mtoy