2009-08-11 72 views
2

我用VC++ 2008和GCC構建了共享庫(.dll,.so)。 問題是,在兩個庫中它顯示私有符號(類,函數)的名稱,它們不會被導出。C++共享庫顯示內部符號

我不希望我的應用程序顯示未導出的類/函數的名稱。 有什麼辦法可以做到這一點?

在GCC我沒有: 編譯時-fvisibility =隱藏,然後由公衆屬性((可見性( 「默認」)))

在VC++: __declspec(DLLEXPORT)

謝謝!

+1

除非你習慣於像TheClientIsAPinhead()這樣的命名方法,否則我真的不知道你的問題是什麼。 – 2009-08-11 17:43:20

+0

你有一個點,但我是偏執狂,不希望其他人根據類和函數檢查程序的結構。只需要一個共享庫,只有導出的符號。 – AllDayCpp 2009-08-11 18:07:19

+0

當你說「它顯示」時,你是什麼意思?它是什麼」? – 2009-08-11 20:17:28

回答

1

對於GNU工具鏈,您可以使用th strip命令從對象文件中刪除符號。它需要各種命令選項來控制其行爲。它可以做你想做的事。

+0

已經做到了。它刪除了一些符號,但不是全部! – AllDayCpp 2009-08-11 17:59:03

0

私人關鍵字僅用於訪問規範時 在編譯時有效地工作,旨在幫助程序員,而不是安全功能 - 因爲您發現使用詞法方式實現了「隱私」 。

很容易看出這一點 - 如果在兩個單獨的.cpp文件中實現兩個相互依賴的私有函數,鏈接器必須在生成的對象(或庫)文件中查找專用名稱。

底線 - C++沒有代碼的安全功能 - 如果你給別人你的程序的目標代碼,他們隨時都可以檢查它。

+0

我正在談論ELF或PE可執行格式的符號。不是私人關鍵字。 – AllDayCpp 2009-08-11 17:59:57

+0

所以,也許你應該從你的問題中刪除C++標籤? – 2009-08-11 18:04:05

1

您可以創建一個頭文件來混淆要隱藏的函數和方法名稱的內部。即像下面的東西(需要一些包括警衛)

#define someFunctionName1 sJkahe28273jwknd 
#define someFunctionName2 lSKlajdwe98 
#define someMethodName1 ksdKLJLKJl22fss 
#define someMethodName2 lsk89hHHuhu7g 

...並將其包含在真正定義所在的頭文件中。

+0

在大型項目中執行它並不實際,它會用定義..惡魔解決方案污染代碼。 – AllDayCpp 2009-08-11 17:58:01

+0

我的建議是將它們保存在單個文件中..所以您不需要看到它們。您稍後在任何代碼中都不會看到它們,只是在某些標題中包含「include」。如果您需要混淆所有可能需要使用某個解析器來提取它們的函數/方法。如果你保持它的一些重要的核心功能,他們應該沒問題手動處理。事情是代碼將是相同的,在二進制文件中的名稱將被混淆。而不是使用一些隨機標識符,可以寫一些不同的函數/方法名稱,希望拋出任何重新設計,例如calculateSecretKey() - > prepareNewDatabase() – epatel 2009-08-11 18:18:48