2012-11-19 35 views
4

我的c/obj-c代碼(使用clang構建的iOS應用程序)的某些功能被#ifdefs排除。我想確保在鏈接時從這些函數中調用的代碼,而不是從其他代碼(死代碼)調用的代碼被刪除(消除)。 我試過了:如何驗證死代碼是否從二進制文件中被刪除?

  1. 在一個應該被刪除的函數中添加一個本地文字char [];在可執行文件上運行strings時,字符串仍然可見。
  2. 添加應該消除的函數;運行字符串時,函數名稱仍然可見。

在你提問之前,我正在爲釋放而建立,並且啓用了所有條帶設置(包括死代碼清除)。

這個問題不是真的xcode /蘋果/ iOS的具體;我假設任何POSIX開發平臺上的答案都應該幾乎相同。

+1

問題中的函數是否定義爲'static'?它們必須是,否則編譯器必須將它們留下以防其他來自不同目標文件的其他代碼想要調用它們。 – Celada

+1

不,它們不是靜態的,但我的觀點是在鏈接時*消除*。鏈接器知道它們是否被使用。 – noamtm

+1

聽起來對我來說,就像你手上有一個項目一樣......通常,鏈接程序只是簡單地取出目標文件中的所有內容並修復它。如果您希望整體程序優化(並且可以將完全程序優化視爲優化),那麼您需要考慮GCC中的工作是否會有所幫助,否則,您可以隨時自行編寫它。如果未使用的函數是靜態的,編譯器將會有所幫助。如果它們不能是靜態的,那麼你會將它們包含在可執行文件中。如果您希望未使用的消除條件,則需要對條件代碼更加小心。 –

回答

2

(EDIT)

在binutils的,ld--gc-sections選項,你想要做什麼有關對象級別的部分。您有幾種選擇:

  • 使用gcc的標誌-ffunction-sections-fdata-sections每個符號隔離到自己的部分,然後用--gc-sections;

  • 全部候選人刪除到一個單獨的文件和鏈接器將能夠剝離整個部分;

  • 反彙編生成的二進制文件,刪除死碼,重新組裝;

  • 使用strip適當-N選擇放棄從 符號表違規符號 - 這將離開的代碼和數據在那裏,但它不會在符號表中顯示出來。

+2

我對這個選項並不熟悉,但我只是閱讀了它,我不認爲它會做OP所需要的。它似乎只用於刪除整個未使用的部分(如'.text','.bss'等),但在這種情況下,我們想要消除某些功能(主要在'.text'中),同時保留其他(也主要在'.text'中)。 – Celada

+0

@Celada謝謝!我已經更新了答案。 – peterph

+0

謝謝。我將檢查iOS中使用的llvm/clang工具鏈是否支持這些選項。 – noamtm

相關問題