ARM Compiler ツールチェーンとの相違点

ここでは GCC/Clang(以後 GCC)と ARM Compiler ツールチェーン (以後 armcc) との、過去に実際に問い合わせのあった相違点を解説します。armcc 向けのコードを移植する際等に参考にしてください。

(GCC と Clang はコンパイラオプションやプラグマ等独自拡張にある程度互換性がありますが、armcc は基本的に互換性が無いので、本項は網羅的な移植ガイドではありません。FAQ や Tips に近いものです。)

armcc には様々なバージョンが存在しますが、ここでは過去に問い合わせが多かった、バージョン 4 と 5 について扱います。(バージョンが明記されていない場合、4 と 5 の全バージョンで共通の仕様となります。)

  • ワイド文字のサイズ

    wchar_t や L"..." のデフォルトは 16 bit となります。 これは --wchar16 オプションを指定したのと同じ設定となります。 GCC は 32 bit で、armcc の --wchar32 オプション指定と同等です。 これは ABI の違いとなりますので、異なるバイナリをリンクしようとした場合

    ` uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail `

    のような警告が出ます。GCC (GNU ld) の場合、 --no-wchar-size-warning オプションでこの警告を抑制することが可能ですが、正常動作は期待できません。

  • armcc リンカの $$Sub$$$$Super$$ による既存関数のオーバーライド

    GCC (GNU ld) では --wrap=SYMBOL オプションで同等の機能が実現可能です。

  • __attribute__((at( ADDRESS ))) で変数を絶対アドレス ADDRESS に配置

    GCC (GNU ld) では、直接はサポートされませんが、リンカスクリプトで以下のように指定することで、同等の機能が実現可能です。

  • コード記述例
unsigned char __attribute__((section (".my_buf_abs_section"))) my_buf[128];
  • リンカスクリプト記述例

    .my_buf_abs_section ADDRESS : {
      KEEP(*(.my_buf_abs_section))
    }
    
  • armcc fromelf イメージ変換ツールの scatter-loading 機能の様な複数バイナリの生成

    GCC (GNU ld) は未サポートです。

  • armcc の _mutex_XXX のようなマルチスレッドアプリケーションにおけるロックの管理機能

    s002 までは未サポートですが、現在開発中のバージョンでは似たような I/F が実装されているので、将来的にはサポートされる予定です。