2016-12-28 32 views
0

我有一個Cocoa Touch框架,它由99.9%純C代碼組成,只有一小部分Objective C在其上。框架應該只導出一個名爲mytestsymbol的符號。要做到這一點,我創建一個只包含此行導出的符號文件:如何剝離Cocoa Touch框架

_mytestsymbol 

我再告訴鏈接使用此文件通過將其添加到「導出符號文件」入口「生成設置/鏈接」在Xcode中。

在C代碼而言,mytestsymbol看起來是這樣的:

void mytestsymbol(void) 
{ 
    start_the_whole_shebang(); 
} 

然而,構建框架時,用十六進制編輯器檢查可執行文件的內容,我可以看到我的C定義的幾乎所有全局符號消息來源仍然存在,但我不想公開這些消息!

在Xcode中檢查Cocoa Touch框架的剝離選項時,我可以看到默認情況下這只是設置爲「調試符號」,而在構建應用程序時默認設置爲「所有符號」。所以我將我的框架的「Strip style」模式更改爲「All symbols」,並嘗試對其進行存檔。

但是,這也行不通。

Symbols referenced by indirect symbol table entries that can't be stripped in: ... 

然後符號列表如下:現在strip歸檔項目時將返回以下錯誤。這些都是我的框架從其他框架導入的所有符號,例如來自C運行庫的東西,如printf,fopen等,但也來自Apple框架如CFBundleCopyBundleURL等。

所以我想我得到這個錯誤,因爲strip試圖去掉這些符號,但這當然是禁止的,因爲這些是我的框架所需要的。

那麼我該如何告訴Xcode去掉只有由我的框架定義的全局符號(mytestsymbol除外),而不是其他任何從其他框架導入的符號?目前,根本沒有可能爲Cocoa Touch Frameworks設置剝離樣式爲「所有符號」。每當這個設置爲「所有符號」,strip(由Xcode中調用)始終返回以下錯誤:

Symbols referenced by indirect symbol table entries that can't be stripped in: ... 

請注意,我說的只是剝離全局C符號。我知道Objective C不能像C一樣剝離,但對我來說沒問題。我真的只關心C符號。我希望除去以外的所有C全局變量,除了這個符號名爲mytestsymbol

任何想法?

回答

3

要回答我自己的問題:因爲引用外部符號(如printf)的可重定位動態庫(Cocoa Touch Frameworks基本上)需要間接符號表,因此不可能在Cocoa Touch Frameworks中使用帶樣式「所有符號」如果「Strip Style」設置爲「All Symbols」,則不在此處。

因此,「條樣式」應簡單地設置爲「非全局符號」。這裏的命名有點令人困惑,因爲「非全局符號」聽起來好像strip在上面的代碼中沒有去掉像mytestsymbol這樣的符號(因爲它是一個全局符號),但實際上它剝離了它。因此,只需使用「非全局符號」條形式即可完美實現。