2013-02-14 89 views
6

我有一個C++項目在Visual Studio 2010下編譯成一個dll。我在我的項目中定義了幾個私有的特定於實現的類,例如CMyClass。這個類不是從dll或任何接口函數中導出的。但是,當我檢查生成的dll文件時,存在一個字符串「CMyClass」。這是一個發佈版本,我不希望這個字符串出現在dll文件中。這個DLL被髮送給客戶,我希望我的項目中使用的所有名稱都被從dll文件中剝離出來,因此沒有人能夠獲得關於我們在dll中使用哪些算法的簡單線索。從二進制dll文件中刪除C++類名稱

我使用Release配置。在項目屬性中,關閉鏈接器選項卡下的「生成調試信息」選項,C/C++選項卡下的「調試信息格式」設置爲「程序數據庫(/ Zi)」。我試圖爲「調試信息格式」設置空字符串,但沒有成功。

在dll中找到的字符串看起來像[email protected]@,位於dll文件的最後。這是dll文件中唯一出現的「CMyClass」字符串。然而,這個字符串幾乎是我所有的內部類。

如何擺脫這些提及?

更新

請注意,我不想混淆源代碼本身。提供的鏈接無關緊要。我只是沒有看到類名存儲在dll文件中的原因。我可以在構建之前總是重命名我的類,但這不是非常直接的解決方案。

UPDATE2

我不與社區同意關閉這個qustion,因爲這不是重複。答案在Tyler Gill的評論中給出。感謝他和其他人的恥辱。

+1

http://stackoverflow.com/questions/1025494/obfuscating-cc-code – Ram 2013-02-14 07:23:10

+1

「我不希望這個字符串出現在dll文件中」你爲什麼認爲這個類的名字的確切原因是什麼被隱藏。編譯C++代碼本身就足夠模糊了! – Ram 2013-02-14 07:29:55

+0

@Ram因爲類的名稱與我們用來解決問題的算法的名稱相對應。我們不希望任何人知道我們使用什麼算法。 – Mikhail 2013-02-14 07:32:56

回答

4

由於我從評論的猜測看起來是正確的,我將其作爲回答重新發布。

類名稱的字符串是爲已編譯的二進制文件啓用RTTI(運行時類型信息)的結果。 RTTI啓用時,編譯器會創建對象,以存儲有關編譯到二進制文件中的類型的信息,其中一個屬性是該類型的名稱。

請注意,dynamic_casttypeid的一些用途需要RTTI,因此禁用將會花費您C++的這些功能。

爲了在Visual Studio中禁用RTTI,使用/GR-開關(見http://msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx,如米哈伊爾張貼。)

要在GCC禁用它,使用-fno-rtti開關。

+1

做了同樣的事情,它只對部分類名起作用。對於其他人來說,RTTI還不夠。顯然,在虛擬函數中使用「std :: bind」時 - 即使禁用了RTTI,類名也可能出現在二進制文件中。簡單地不要使用std :: bind(或相關函數) – 2014-03-20 00:10:34

2

由於Tyler Gill在評論中提到,由於RTTI,此字符串由編譯器留下,因爲CMyClass實際上繼承IMyClass並且是多態的。我的問題可以通過disabling RTTI/GR-開關輕鬆解決。謝謝。