4.3 未使用セクションの削除

未使用セクションの削除は、リンカによって実行される、イメージサイズに対する最も重要な最適化です。

未使用セクションの削除:
  • アクセスされないコードとデータを最終イメージから削除します。
  • 結果としてすべてのセクションが削除されるような場合にはサポートされません。
この最適化を制御するには、--remove--no_remove--first--last、および --keep リンカオプションを使用します。
未使用セクションを削除するには、エントリポイントが必要です。そのため、未使用セクションの削除が有効な場合に、イメージにエントリポイントが指定されていないときは、--entry リンカオプションを使用して、エントリポイントを指定し、未使用セクションを削除できるようにします。

デフォルトでは、--dll を使用して DLL をビルドする場合、または --shared を使用して共有ライブラリをビルドする場合、未使用セクションの削除は無効になります。そのため、未使用セクションの削除を再度有効にするには、--remove を明示的に含める必要があります。
--info unused リンカオプションを使用すると、削除された未使用セクションのリストを生成できます。
入力セクションは、以下の場合に最終イメージに保持されます。
  • エントリポイントが含まれている場合。
  • エントリポイントを含む入力セクションから非弱参照によって、直接的または間接的に参照される場合。
  • --first オプションまたは --last オプション(あるいはこれと同じ意味を持つスキャッタロードの記述)を使用して、最初または最後の入力セクションとして指定されている場合。
  • --keep オプションによって削除不可としてマークされている場合。

通常、コンパイラは関数とデータを一緒にまとめ、カテゴリごとに 1 つのセクションを生成します。リンカでは、セクション全体が未使用の場合にのみ、そのセクションを削除できます。
ソースコード内の関数または変数は、__attribute__((used)) 属性を使用してマークできます。そうすると、armcc によって各関数および変数に対してシンボル __tagsym$$used が生成されます。__tagsym$$used の定義を含むセクションは、未使用セクションの削除によって削除されることがなくなります。
また、--split_sections コンパイラコマンドラインオプションを使用して、ソースファイル内の関数ごとに 1 つの ELF セクションを生成するようにコンパイラに指示することもできます。
関連する概念
4.1 共通デバッグセクションの削除
4.2 共通グループまたは共通セクションの削除
4.4 未使用仮想関数の削除
3.1.2 入力セクション、出力セクション、領域、およびプログラムセグメント
3.8 弱参照と定義
関連する参考文書
12.50 --entry=location
12.62 --first=section_id
12.78 --keep=section_id
12.80 --last=section_id
12.71 --info=topic[,topic,…]
12.117 --remove、--no_remove
関連情報
--split_sections コンパイラオプション
__attribute__((used)) 関数属性
__attribute__((used)) 変数属性
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.