4.2 共通グループまたは共通セクションの削除

リンカはグループとセクションの複数のコピーを検出し、追加のコピーを破棄できます。

ARM® コンパイラは、リンク用の完全なオブジェクトを生成します。そのため、
  • C および C++ ソースにインライン関数が含まれている場合、各オブジェクトにそれぞれが必要とするインライン関数のアウトオブラインコピーが保持されます。
  • C++ ソース内でテンプレートが使用されている場合、各オブジェクトにそれぞれが必要とするテンプレート関数が保持されます。
このような関数が共通ヘッダファイルで宣言されている場合、関数は、その後リンクする各オブジェクト内で何度も定義される可能性があります。コンパイラでは、重複を回避するために、これらの関数を共通コードセクションまたは共通グループの個々のインスタンスにコンパイルします。
共通コードセクションまたは共通グループの個々のインスタンスが同一でない場合もあります。例えば、コピーの一部は、異なる(ただし互換性のある)ビルドオプション、最適化、またはデバッグオプションを使用してビルドされたライブラリ内で検出される場合があります。
コピーが同一でない場合、armlink は、入力オブジェクトの属性に基づき、各共通コードセクションまたは各共通グループの最も可用性の高いバリアントを保持し、それ以外のバリアントを破棄します。
コピーが同一である場合、armlink は、最初に検出したセクションまたはグループを保持します。
この最適化は、以下のリンカオプションを使用して制御します。
  • --bestdebug オプションを使用すると、最大の共通データ(COMDAT)グループを使用できます(最適なデバッグビューが提供される可能性が高くなります)。
  • --no_bestdebug オプションを使用すると、最小の COMDAT グループを使用できます(コードサイズを最も小さくできる可能性が高くなります)。これがデフォルトです。)
    no_bestdebug はデフォルトなので、 --debug を使用してコンパイル中にデバッグテーブルを生成するかどうかに関係なく、最終イメージは同じになります。
関連する概念
4.1 共通デバッグセクションの削除
4.3 未使用セクションの削除
4.4 未使用仮想関数の削除
3.1.2 入力セクション、出力セクション、領域、およびプログラムセグメント
関連する参考文書
12.14 --bestdebug、--no_bestdebug
関連情報
インライン関数
--debug、--no_debug コンパイラオプション
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.