リンカフィードバックの使用例

リンカフィードバックの動作を確認するには

  1. この例に示すコードを含む fb.c という名前のファイルを作成します。

    Example 1. フィードバックの例

    #include <stdio.h>
    
    void legacy()
    {
        printf("This is a legacy function that is no longer used.\n");
    }
    
    int cubed(int i)
    {
        return i*i*i;
    }
    
    void main()
    {
        int n = 3;
        printf("%d cubed = %d\n",n,cubed(n));
    }
    

  2. 以下のコマンドラインを実行して、プログラムをコンパイルし、フィードバックファイルが存在しないことを示す警告メッセージは無視します。

    armcc --asm -c --feedback fb.txt fb.c
    

    これにより、デフォルトでは cubed() 関数がインライン化されます。また、アセンブラファイル fb.s とオブジェクトファイル fb.o が作成されます。 アセンブラファイルには、legacy()cubed() のコードが残っていますが、 インライン化により、main から cubed() を呼び出すことはありません。

    cubed() のアウトオブラインコピーは、static として宣言されていないため、保持されています。

  3. 以下のコマンドラインを実行して、オブジェクトファイルをリンクし、リンカフィードバックファイルを作成します。

    armlink --info sizes --list fbout1.txt --feedback fb.txt fb.o -o fb.axf
    

    リンカによる診断結果がファイル fbout1.txt に出力されます。

    リンカフィードバックファイルは、(コンパイラで使用されない)コメントとして未使用の関数を含み、かつ legacy() 関数と cubed() 関数のエントリを含んでいるソースファイルを特定します。以下に例を示します。

    ;#<FEEDBACK># ARM Linker, 5.01 [Build num]: Last Updated: 日付
    ;VERSION 0.2
    ;FILE fb.o
    cubed <= USED 0
    legacy <= USED 0
    

    このフィードバックファイルは、2 つの関数が使用されていないことを示します。

  4. 以下のコマンドラインを実行し、別の診断ファイルを使用してコンパイルとリンクのステージを実行します。

    armcc --asm -c --feedback fb.txt fb.c
    
    armlink --info sizes --list fbout2.txt fb.o -o fb.axf
    
  5. 2 つの診断ファイル fbout1.txtfbout2.txt を比較し、イメージのコンポーネント(例えば、Code、RO Data、RW Data、ZI Data)のサイズを確認します。 Code コンポーネントが小さくなります。

    アセンブラファイル fb.s では、legacy() 関数と cubed() 関数は、今後 main() 関数と同じ領域には存在しません。 これらの関数は関数独自の ELF セクションにコンパイルされます。 そのため、armlink は最終イメージから legacy() 関数と cubed() 関数を削除できます。

Note

リンカフィードバックを最大限に活用するには、完全なコンパイルとリンクを 2 回以上実行する必要があります。 ただし、通常は、前回のビルドのフィードバックを使用して 1 回コンパイルしてリンクすれば十分です。

Show/hide関連項目

Copyright © 2010-2012 ARM. All rights reserved.ARM DUI 0474GJ
Non-ConfidentialID051612