4

私の c/obj-c コード (clang でビルドされた iOS アプリ) には、#ifdefs. これらの関数から呼び出され、他の関数から呼び出されないコード (デッド コード) がリンク時に取り除かれる (削除される) ことを確認したいと考えています。私は試した:

  1. 削除する必要がある関数にローカル リテラル char[] を追加します。実行可能ファイルで実行されている場合、文字列は引き続き表示stringsされます。
  2. 削除する必要がある機能を追加します。文字列を実行するとき、関数名は引き続き表示されます。

あなたが尋ねる前に、私はリリース用にビルドしており、すべてのストリップ設定 (明らかにデッドコード ストリップを含む) が有効になっています。

問題は実際には xcode/apple/iOS 固有のものではありません。答えは、どの POSIX 開発プラットフォームでもほぼ同じはずです。

4

1 に答える 1

2

(編集)

binutils にldは、--gc-sectionsオブジェクト レベルのセクションで必要なことを行うオプションがあります。いくつかのオプションがあります:

  • gccのフラグ-ffunction-sectionsを使用-fdata-sectionsして、各シンボルを独自のセクションに分離し、次に--gc-sections;を使用します。

  • 削除するすべての候補を別のファイルに入れると、リンカーはセクション全体を削除できます。

  • 結果のバイナリを逆アセンブルし、デッド コードを削除して、再度アセンブルします。

  • strip適切なオプションを使用し-Nて、問題のあるシンボルをシンボル テーブルから破棄します。これにより、コードとデータはそこに残りますが、シンボル テーブルには表示されません。

于 2012-11-19T23:16:51.113 に答える