我的c/obj-c代碼(使用clang構建的iOS應用程序)的某些功能被#ifdefs
排除。我想確保在鏈接時從這些函數中調用的代碼,而不是從其他代碼(死代碼)調用的代碼被刪除(消除)。 我試過了:如何驗證死代碼是否從二進制文件中被刪除?
- 在一個應該被刪除的函數中添加一個本地文字char [];在可執行文件上運行
strings
時,字符串仍然可見。 - 添加應該消除的函數;運行字符串時,函數名稱仍然可見。
在你提問之前,我正在爲釋放而建立,並且啓用了所有條帶設置(包括死代碼清除)。
這個問題不是真的xcode /蘋果/ iOS的具體;我假設任何POSIX開發平臺上的答案都應該幾乎相同。
問題中的函數是否定義爲'static'?它們必須是,否則編譯器必須將它們留下以防其他來自不同目標文件的其他代碼想要調用它們。 – Celada
不,它們不是靜態的,但我的觀點是在鏈接時*消除*。鏈接器知道它們是否被使用。 – noamtm
聽起來對我來說,就像你手上有一個項目一樣......通常,鏈接程序只是簡單地取出目標文件中的所有內容並修復它。如果您希望整體程序優化(並且可以將完全程序優化視爲優化),那麼您需要考慮GCC中的工作是否會有所幫助,否則,您可以隨時自行編寫它。如果未使用的函數是靜態的,編譯器將會有所幫助。如果它們不能是靜態的,那麼你會將它們包含在可執行文件中。如果您希望未使用的消除條件,則需要對條件代碼更加小心。 –