2009-12-19 62 views
7
地帶二進制

Mac系統10.6,如​​果我有一個文件 「unwanted.c」,其中包含:如何真正在MacOS上

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

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

現在我做:

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

如果我打出了接口和實現祕密類,正如大多數人在編寫C++代碼時所做的那樣,在剝離的可執行文件中沒有不需要的符號。不幸的是,我遞交了一個有數千行代碼的現有代碼庫,這不是我的選擇之一。

我試過-fno-rtti,作爲一個猜測,並沒有解決任何問題。我曾向Google的衆神禱告,並發現許多脫衣俱樂部的參考資料,但沒有有用的鏈接。我已經瀏覽了mac上的strip,g ++和ld的手冊頁,並且沒有明顯的嘗試,儘管「私人外部」這個短語很有趣,但我無法弄清楚該怎麼做。

[更新] 不幸的是,我發現一個小例子的嘗試是一個問題。這是一個更復雜的例子,它更接近真正的問題,如果它被優化,它仍然有不需要的符號。

對於不好的例子,我表示歉意。事實證明很難找到最小的實際問題。非常感謝答案,但每個答案都讓我接近解決方案。

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

回答

8

使用下面的編譯行我成功地從可執行符號:

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

鑑於最新的樣本文件,此結果在:

$ 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

我發錯了代碼。帶正確的示例代碼,正如現在問題所讀的問題,通過INSIDE類定義中的方法實現,strip表示: strip:無法在/ Users/michael中刪除的間接符號表項引用的符號。玩具/不想要的 __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy 2009-12-19 02:04:51

+0

但是,答案非常有用,因爲它給了我更多谷歌飼料,錯誤字符串確實揭示了一些更有趣的調查領域。 – mtoy 2009-12-19 02:11:14

1

鑑於沒有被nm顯示您發佈的示例代碼,添加了「-O」優化標誌導致那些符號編譯完成後。

+0

已經發布了一個仍然存在問題的更接近實際問題的示例。驅動我到這一點的原始應用程序已經被優化。謝謝回覆。 – mtoy 2009-12-21 19:53:01

2

這聽起來像你真正想要的不是去除可執行文件,而是混淆它的符號表。我不確定,但可能類似this會有所幫助。至少,「C++符號表混淆」可能是一個更好的谷歌搜索字符串..

+0

我真的想剝奪可執行文件。但是,這可能會出現在筆記本的標題「我希望我永遠不需要實施的備份解決方案」的標題下。它正好位於「編寫我自己的後處理器,該處理器鏈接需要這些符號的任何未鏈接的鏈接,然後剝離符號」 – mtoy 2009-12-21 22:28:50