2009-12-19 22 views
7
bir ikili şerit Nasıl

MacOs 10.6, bir dosyayı içeren "unwanted.c" varsa:GERÇEKTEN MacOs

class secret_thing { 
public: 
secret_thing() {} 
void revealing_method_name() {} 
}; 

main() 
{ 
    secret_thing obj; 
    obj.revealing_method_name(); 
} 

Şimdi biliyorum:

$ g++ unwanted.c -o unwanted 
$ strip unwanted 
$ nm unwanted | grep secret 
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv 
0000000100000eae T __ZN12secret_thingC1Ev 

dışarı bölerseniz C++ kodu yazarken çoğu kişi yaptığı gibi, gizli sınıfın arayüzü ve uygulanması, sonra soyulmuş yürütülebilir dosyasında istenmeyen semboller yoktur. Ne yazık ki, binlerce satırlık kodun mevcut bir kod tabanını kullanıyorum ve bu benim seçimlerimden biri değil.

Vahşi bir tahmin olarak -fno-rtti'yi denedim ve bu hiçbir şeyi düzeltmedi. Google tanrılarına dua ettim ve kulüpleri yayınlamak için birçok referans buldum, ancak hiçbir yararlı bağlantı yoktu. Adam sayfalarını macda strip, g ++ ve ld için eğittim ve denemek için açık bir şey yoktu, "özel örnekler" ifadesi ilgi çekiciydi, bununla ilgili ne yapacağımı anlayamadım.

[update] Ne yazık ki, küçük bir örnek oluşturma girişimi ile ilgili bir sorun ortaya çıkıyor. İşte, gerçek problemin ne olduğuna daha yakın olan, daha da optimize edilmiş bir yapı ise, hala istenmeyen sembollere sahip olan daha karmaşık bir örnek.

Kötü örnekler için özür dilerim. En küçük gerçek problemi bulmak zor olduğu ortaya çıkıyor. Cevaplar için çok teşekkürler, ancak her cevap bir çözüme yaklaştı.

Bu istendiği gibi çalışmıyor gibi görünüyor
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(); 
} 

cevap

8

muhtemelen sonuçları:

$ 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

...:

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

Gönderilen yanlış kod vardı. Doğru örnek kod, şimdi okuduğu gibi, sınıf tanımı INSIDE yöntemlerinin uygulanmasıyla birlikte, diyor ki: strip::/Users/michael. oyuncak/istenmeyen __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy

+0

Ancak cevap daha yararlı oldu, çünkü bana daha fazla google yem verdi, bu hata dizisi daha ilginç araştırma alanlarını açığa çıkardı. – mtoy

1

nm tarafından gösterilen olmayanlar sembolleri '-o' optimizasyon bayrak sonuçlar ekleyerek Yayınladığınız örnek kod, Verilen derlemeden sonra.

+0

Sorunu hala sergileyen daha yakın bir sorun örneği gönderdiniz. Beni bu noktaya götüren orijinal uygulama optimize edildi. Cevap için teşekkürler. – mtoy

2

Gerçekten istediğiniz şey, yürütülebilir dosyayı kesip çıkartmamak, ancak sembol tablosunu gizlemek gibi bir şey. Emin değilim ama belki de this gibi bir şey yardımcı olabilir. Bu, son örnek dosyası Verilen

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

: En azından, "C++ simge tablosu obfuscation" Ben başarıyla yürütülebilir sembolleri şerit aşağıdaki derleme hattını kullanarak daha iyi bir Google arama dizesi ..

+0

Uygulamanın gerçekten çıkarılmasını istiyorum. Ancak, bu muhtemelen deftere, "Yedekleme çözümleri umarım asla uygulamaya gerek duymadığım" başlığı altında gider. Yukarıdaki "bu sembollere ihtiyaç duyan ve daha sonra sembolleri çizen bağlantısız olan şeyleri birbirine bağlayan kendi posta işlemcimi yaz" ın hemen üstündedir. – mtoy