2011-12-12 94 views
5

我想提供一個C靜態庫並儘可能隱藏內部實現。我在代碼中使用了代碼混淆器,這對於讓人類無法識別符號非常有效。我正在使用xcode 4,我認爲它具有像GCC一樣的標誌。如何隱藏靜態庫中的對象文件名?

我的問題是,我的圖書館仍包含可讀信息,我想隱藏或作出難以理解的人:

1 - 目標文件名: 當我在。一跑納米,我仍然看到每個對象文件的名稱。 (即myObect1.o myObject2.o等)。有沒有辦法從我的.a中刪除這些名稱?

2-文件路徑: 當我在我的庫上運行字符串時,仍然可以看到頭文件的路徑以及一些.c文件路徑(作爲#include包含)。有沒有辦法去除這些。 (海灣合作委員會國旗或其他方式)?

感謝您的幫助,

巴巴

PS:我知道納米和字符串,但如果你知道任何其他工具,或者如果你能提出什麼我應該檢查是否正確藏在我。 a,所有的建議都是值得歡迎的。

+1

看看[GNU strip](http://linux.die.net/man/1/strip)是否可以做你想做的。 –

回答

2

考慮像SQLite那樣分發合併:http://www.sqlite.org/amalgamation.html。換句話說,而不是一個庫,分發一個.o文件和一個.h文件。

您必須將您的內部函數註釋爲靜態。這也將爲編譯器提供進一步的優化機會。 Lua使用這種註釋。例如參見http://www.lua.org/source/5.1/ldo.h.html。對於合併,LUAI_FUNC被定義爲靜態。

+0

謝謝它的工作原理!但有一個問題:將內部函數聲明爲靜態(它們的名稱已經被混淆並因此不可讀取)有什麼好處。也可以聲明函數爲靜態導致任何問題,例如像嵌入式平板如ios?我只是不太熟悉static關鍵字的用法,並且我聽說在嵌入式平臺上聲明變量爲靜態的限制。功能是否一樣? – Baba

+0

@Baba,正如我所說的,靜態函數允許編譯器生成更好的代碼,甚至內聯它們。靜態函數與靜態變量不同。他們只分享他們在模塊外不可見的事實。不,靜態功能不應該給嵌入式平臺帶來任何問題。 – lhf