ARM Compiler ツールチェーンとの相違点
ここでは GCC/Clang(以後 GCC)と ARM Compiler ツールチェーン (以後 armcc) との、過去に実際に問い合わせのあった相違点を解説します。armcc 向けのコードを移植する際等に参考にしてください。
(GCC と Clang はコンパイラオプションやプラグマ等独自拡張にある程度互換性がありますが、armcc は基本的に互換性が無いので、本項は網羅的な移植ガイドではありません。FAQ や Tips に近いものです。)
armcc には様々なバージョンが存在しますが、ここでは過去に問い合わせが多かった、バージョン 4 と 5 について扱います。(バージョンが明記されていない場合、4 と 5 の全バージョンで共通の仕様となります。)
ワイド文字のサイズ
armcc では 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 が実装されているので、将来的にはサポートされる予定です。