重要な情報
-
5.20ツールセットには、プログラム起動時にすべて(または大部分)のコードをRAMにコピー可能にする新しい機能が備わっています。これらの機能の1つでは、起動コードが参照するセクションが'initialize by copy'ディレクティブの影響を受けないようにリンカが保護し、コピー初期化が完了した後に実行されるコードのみがRAMにコピーされるようにします。
場合によっては、新しいリンカおよびライブラリとリンクしたときに、以前のプロジェクトが機能しなくなる可能性もあります。一例として、リリース5.1Xのいずれかのモジュールに基づいて独自のcstartupモジュールを提供し、'initialize by copy'ディレクティブで、プログラム起動時に割込みテーブルがRAMにコピーされるよう指定する場合が考えられます。
これを修正するには、割込みテーブルに特殊なシンボル__iar_init$$done
でマークを付け、必要となる前にコピー初期化を実行するよう指示します。こうしなければ、'initialize by copy'ディレクティブで記述されていても、割込みテーブルはコピーされません。Cortex-Mコプロセッサの場合、これを行う必要があるのは、独自のcmainモジュールも提供する場合のみです。Atmelの例はほとんどの場合、上記の方法で記述されています。修正する方法は、ラベル
__iar_init$$done
をベクタテーブルの前に置くことです。
例:SECTION .intvec:CODE:NOROOT(2) ARM __iar_init$$done:; ベクタテーブルはコピー初期化が ; 実行されるまで不要 __vector: LDR PC,Reset_Addr ; リセット : :
-
EWARM 6.10.2:
コードサイズ制限版では、リンカはベーシックなヒープ実装を選択します。つまり、リンカコマンドラインオプションの
--basic_heap
が標準版で使用される場合と同じです。
新機能
- なし。
既知の問題
-
cstartup.s
を使用してビルドすると、MISRA-Cチェッカでエラーが誤って報告されます。
[EW19800] -
リンカ設定ファイルの
==
および!=
演算子で、間違った結果が生成されます。
[EW22755]
プログラム修正
-
DATA
、CODE16
など間違ったモード記述を持つアセンブラファイルによって、リンカでインターナルエラーが発生しなくなりました。
[EW22464] -
ブロックを1つ持ち、自身のサイズよりも大きいアラインメントを持つ
place at end
リンカディレクティブで、インターナルエラーが発生しなくなりました。
[EW22620]
ユーザガイドの訂正
- なし。
その他
-
Cortex-R4用の特別なランタイムライブラリ
Cortex-R4のためにビルドする場合、アーキテクチャ5E用のライブラリが自動的にリンカによって選択されます。ただし、ハードウェア除算を利用するには、7Rに特別なライブラリが1つ必要です。このライブラリの名前はdiv7R_t.aで、リトルエンディアンとビッグエンディアンに1つずつあります。
リリース履歴
V6.21 2011-07-05
プログラム修正- なし。
- なし。
V6.20 2011-04-29
プログラム修正-
place at end of
ディレクティブを高いアラインメントのセクションまたはブロックを含む内容に使用しても、インターナルエラーが発生しなくなりました。
[EW22255] -
--strip
とともにielftool
を使用しても、文字列テーブルなどELFセクションに関するすべてのバグ情報が削除されませんでした。これらも削除されるようになりました。
[EW22372]
- なし。
V6.10 2010-11-04
プログラム修正-
リンカがエラーLp017 (compressed initializers needed an address that could not be determined until the size of compressed initializers is known - 圧縮されたイニシャライザに、圧縮されたイニシャライザが認識されるまで確定できないアドレスが必要)を出力した後で、インターナルエラーによりクラッシュすることがありました。
[EW21191] -
place at
ディレクティブに必要な内容がなく、メモリ範囲が部分的に他のセクション配置ディレクティブと重なっている場合に、インターナルエラーが発生することがありました。
[EW21572] -
place at
ディレクティブのセクション/ブロックが指定範囲に入りきらないときに、出力される診断メッセージが意味不明でした。例:Error[Lp011]:section placement failed:unable to allocate space for sections/blocks with a total estimated minimum size of 0x0 bytes in<> (total uncommitted space 0xffffffffffff372c).Needed:
[EW21849] -
ROMサイズの制限を持つ製品からリリースビルドの出力をロードするときに、一部のROM使用が上限に対して計算されない場合でも、C-SPYが誤ったエラー"ROM size limit exceeded"(ROMサイズ上限を超過)を出力することがありました。
[EW21909] -
ielftool
が、フィルとチェックサム関数を実行する際、セクションデータではなくセグメントデータを使用するようになりました。
[EW22329] -
silentオプションを使用する場合、Iarchiveが正しい終了ステータスを返すようになりました。
[EW21944]
- なし。
V5.50 2010-04-21
プログラム修正-
必要なモジュールローカル絶対シンボルがリンカによって保持されず、スペースが予約されませんでした。
例:static __no_init int array[10] @ 0x100;
[EW21528] -
いくつかの
place at
コマンドが、ベニアが必要なときに重複が発生する形で使用されると、セクション配置が失敗することがありました。
[EW21647] -
偶数の4バイト境界上で終わらないELFセクションを拡張すると、エラーとなる場合がありました。
[EW21654] -
EWARM 5.50.5:
place at
セクション配置ディレクティブのシーケンスを同じメモリ領域に入れ、片方は圧縮されたイニシャライザがあって、後で内容を持たないブロックのみからなるものがある場合に、リンカでインターナルエラーが発生しなくなりました。
[EW21746] -
EWARM 5.50.5:
ilinkarm
5.50.0からは、リンカは常にinitテーブルセクションを生成するようになりました。initテーブルが必要でないビルドにおいて、これによりinitテーブルセクションに一致するセクション配置パターンを格納するための構成ファイルが無駄に必要となっていました。initテーブルセクションは、不要なときには生成されなくなりました。
[EW21761]
- なし。
V5.41 2009-12-14
プログラム修正-
ベニアを必要とするコードの1ブロックをコピーすることによる初期化で、一部のコードセクションにベニアより小さいアラインメントがあった場合、リンカがエラーLp020(圧縮されたイニシャライザが大きすぎて合わない)によって失敗しなくなりました。
[EW21183] -
EWARM 5.41.2:
ある範囲のplace in
ディレクティブがplace at
ディレクティブの範囲の開始/終了位置をまたいでいても、リンカがインターナルエラーによって終了しなくなりました。
[EW21488] -
EWARM 5.41.2:
アセンブリコードにおいて、絶対アドレスを参照するpc
に相対する命令(分岐のような)によって、リンクの際に誤って未定義のシンボルエラーが発生しなくなりました。
[EW21525]
- なし。
V5.40 2009-07-10
プログラム修正-
place at
コマンドで必要な範囲が、より大きな開始アドレスでplace in
コマンドと一部重複したときに、セクションの配置が[range allocation inconsistency]
というインターナルエラーにより失敗する場合がありました。
[EW20817] -
圧縮されたイニシャライザを圧縮アルゴリズムのパックビット、lzwまたはbwtとともに使用する場合、イニシャライザのサイズに依存するアドレスにイニシャライザの目的地を配置できません。これを行うと、インターナルエラーが発生していましたが、新しいエラー
Lp021
が出力されるようになりました。
[EW20842] -
locale.h
ファイルをインクルードすると、フルのDLIB (ロケールサポートを含む)とのリンクが強制されていました。これは、ロケールサポートが実際に要求されたときにだけ発生するように修正されました。
[EW20850] -
シンボルテーブルを入力として持たないELFファイルを使用している場合に、
ielftool
がクラッシュしなくなりました。
[EW20883] -
場合によって、
place at
ディレクティブによるリンクが失敗し、エラーLp011 (section placement failed)
が出力されることがありました。
[EW20901] -
ブロック外に複数のゼロまたはコピー領域を持つリンクジョブで初期化テーブルをビルドする際に、リンカでの内部計算エラーによって、セクション配置が失敗し、エラー
Lp011
が出力される場合がありました。
[EW20968, 20986] -
コンパイラが、定数のいずれかが使用されていれば、型自体が使用されていなくても列挙型のデバッグ情報を出力します。未指定の列挙型の場合、これらの定数はデバッガで表示されませんでした。これらが表示されるようになりました。
[EW21053] -
'at end'配置を使用してリンカにより生成されたinitテーブルを配置すると、リンカでインターナルエラーが発生する場合がありました。
[EW21065] -
EWARM 5.40.4:
リンカが変更されて、自動的に選択されたライブラリはコマンドラインオプションに一致すると想定するようなりました。
[EW21201] -
EWARM 5.40.4:
入力ELFファイルに複数のセクションを持つセグメントが含まれていると、ielftool
が正しい出力を生成するようになりました。
[EW21194、EW21196、EW21286]
- なし。
V5.30 2009-01-23
プログラム修正
-
EWARM 5.30.2:
(__section_endまたは$$Limitシンボルを使用して)末端が参照されているブロック内の圧縮されたイニシャライザを使用してアプリケーションをリンクする場合、Ilinkで配列境界違反が発生し、インターナルエラーまたはより重大なエラーとなる可能性がありました。
[EW20796] -
ゼロサイズのフラグメントのみからなる1つのセクションを持つオブジェクトファイルをリンクすると、リンカでインターナルエラーが発生しました。
[EW19873] -
配置が空であるが、アラインメント用件を持つファイルをリンクする場合、インターナルエラー(
ApplyState - No allocation change
)によってリンカが終了することがありました。
[EW20353] -
非常に小さいセクションの場合に、セクションの配置が失敗することがありました。通常は、関数と変数が同じメモリ領域に配置され、リーチの限界に近い呼び出しが多くあった場合にこの問題が発生する可能性がありました。これによって、いくつのベニアが必要なのかが非常に不明確になっていました。
[EW20464] -
適切なエラーメッセージが出力された後、プログラム内の一部のセクションがいずれかの配置ディレクティブと一致しなければ、インターナルエラーが発生してリンカが終了する場合がありました。
[EW20481] -
同じ開始アドレス上にある
place in
ディレクティブおよびplace at
ディレクティブが設定に含まれ、place at
ディレクティブがゼロバイトを占有する場合、リンカがインターナルエラーで終了する可能性がありました。
[EW20656] -
--interworkなしにコンパイルされ、静的関数とパブリック関数が混在する変換ユニット内の関数に対する互換性チェックは、これまでリンカで壊れていました。このために、誤った互換エラー(Lt020)が発生するだけでなく、報告すべきでありながらこうした問題を報告できないという結果になっていました。
[EW20745]
-
イニシャライザの圧縮
リンカは初期化したデータを圧縮して、フラッシュの使用を最小に抑えることができます。圧縮されたデータは、フラッシュからRAMに移動すると起動コードによって自動的に解凍されます。
V5.20 2008-06-24
プログラム修正
-
export
ディレクティブを使用してリンカ設定ファイルから不明なシンボルをエクスポートしても、問題を報告した後でilinkarm
がインターナルエラーにより終了しなくなりました。
[EW19729] -
ielftool
は、長さが4の倍数でないELFセクションについて、sum32チェックサムを計算できるようになりました。
[EW19817] -
ielftool
は、長さが4の倍数でないELFファイルについて、フィル処理を実行できるようになりました。
[EW19835] -
ilinkarm
が、ゼロ化されたinitテーブルのエントリを出力可能になりました。以前は、プログラム起動時に、ゼロでフィルされるべき1つまたは複数のメモリ範囲が、ゼロでフィルされなくなっていました。
[EW19853] -
MISRA-C規則23をチェックする際に、
ilinkarm
がツールの内部シンボルを誤って含むことがなくなり、不要な規則違反エラーとなることがなくなりました。また、エラーLi0005 (未定義のシンボル)が以前に発生した場合に、
ilinkarm
がクラッシュしなくなりました。
[EW19897] -
どのセクションにも一致せず、
place in
ディレクティブのメモリ範囲と重複し、ブロックを含まないplace at
ディレクティブによって、リンク時にインターナルエラーとなることがなくなりました。
[EW19952]
[EW20030] -
重複する範囲を含むプロジェクトをリンクする際に、重複のサイズが範囲と比較して小さい場合、
ilinkarm
がインターナルエラーで終了しなくなりました。
[EW19985] -
ソースELFファイルで新しいベースアドレスで始まるセクションの前にデータが含まれない場合、
ielftool
からのIntel hex出力に不正なベースアドレスレコードが含まれなくなりました。
[EW20031] -
ブロック内のコードのコピー初期化で、ブロックの最初がベニアの場合に、生成が正しく行われるようになりました。
[EW20040] -
リンカ設定ファイルでチェーンになっている
if
ディレクティブ(if...else if...else
)が、正しく機能するようになりました。
[EW20104] -
place at
およびplace in
セクション配置ディレクティブが同じ開始アドレスを使用する場合、リンカでインターナルエラー(範囲割当ての不一致)が発生しなくなりました。
[EW20183]
-
RAMへのコードのコピー
プログラム起動時にコードのすべてをRAMにコピーする機能が改善されました。上記を参照してください。 -
位置に依存しないベニア
リンカが、--pi_veneers
コマンドラインオプションを使用して、位置に依存しないベニアを生成できます。
V5.11 2007-12-11
ilinkarm
が、誤ってplace at
リンカディレクティブの始めにフォールスルーベニアを配置し、そこで終わるべきセクションを間違った位置に置いていました。
[EW19456]ielftool
(以前のichecksum
)が、ビッグエンディアンファイルのチェックサムを正しく処理するようになりました。
[EW19466]ielftool
(以前のichecksum
) が算術合計アルゴリズムを認識しませんでした。
[EW19490]場合によっては、
ielftool
(以前のichecksum
) がチェックサムの値を出力ファイルに書き込みませんでした。
[EW19496]リンカが、入力に同じシンボルの弱い定義が混在する場合、同じシンボルに対して複数の定義を誤ってインクルードしたため、一部の定義がELFセクショングループを使用し、他の定義でそれが使用されていないという状態になっていました。
[EW19502]ielftool
(以前のichecksum
) が、チェックサムのプレースホルダ変数がconst
として定義されていない場合に、エラーメッセージを出力するようになりました。
[EW19538]place in
範囲の真ん中でplace at
を使用すると、インターナルエラーが発生する場合がありました。
[EW19578]-
ilinkarm
が時おり、'place at'配置で必要のない余分なバイトを予約していました。
[EW19604] -
場合によっては、フォールスルーのモードを変更するベニアを、ベニアの目的地の直前以外の場所に配置することができ、コードが機能しなくなっていました。
[EW19726]
V5.10 2007-05-25
- 初回リリース。