*.map と *.lst ファイルにある (+ 304 bytes shared) は何ですか?

テクニカル・ノート 29512

アーキテクチャ:

430, AVR, AVR32, 8051, M16C, M32C, R32C, CF, CR16C, H8, HCS12, MAXQ, S08, SAM8, V850

コンポーネント:

linker

更新日:

2018/08/08 8:32

はじめに

生成されたバイト数に関する情報が収集・表示されます。しかし、この情報の一部は解読するのが困難な場合があります。本テクニカルノートでは、「共有バイト」に焦点を当てて説明します(本テクニカルノートでは、IAR ILINKリンカを使用する製品については扱いません)。

詳細

関数とメモリごとのデータに対して生成されたバイト数に関する情報がstdoutに転送され、画面上に表示されます。それらのバイトの一部が「共有」として報告されることもあります。その例と詳細を以下に示します。

---calendar.lst-------------------------------------------------------------

5 646 bytes of CODE memory (+ 304 bytes shared)
656 bytes of CONST memory
288 bytes of DATA memory

Errors: none
Warnings: none

---calendar.s**-------------------------------------------------------------

PUBWEAK `?*?DATA_ID`
MULTWEAK ??BKP_DeInit??rT
MULTWEAK ??BKP_ReadBackupRegister??rT
MULTWEAK ??BKP_WriteBackupRegister??rT

---STM32F10x_Demo.map-------------------------------------------------------

DATA_ID
Segment part 87.NOT NEEDED.
ENTRY ADDRESS REF BY
===== ======= ======
?*?DATA_ID

----------------------------------------------------------------------------

上記の例では、*.lstおよびstdoutで示されているように、304バイトが共有されています。アセンブラファイルの*.s**を見ると、PUBWEAKとMULTWEAKというエントリに共有のマークがついています。これらのエントリは、*.mapではNOT NEEDEDとなっています。

情報を取得するためのオプション

  • IAR Embedded Workbench IDE > Project > Options... > C/C++ Compiler > List > Output assembler fileを選択
  • IAR Embedded Workbench IDE > Project > Options... > Linker > List > Include suppressed entriesを選択

.\Release\List\*.mapを生成する

  • IAR Embedded Workbench IDE > Project > Options... > Category: Linker > Diagnostics > Always generate outputを選択
  • IAR Embedded Workbench IDE > Project > Options... > Category: Linker > List > Generate linker listingおよびModule summaryを選択

サイズおよびstdoutで使用されたコマンドラインを確認する

  • IAR Embedded Workbench IDE > Tools > Options... > IDE Options> Messages > Show build messages > Allを選択

コンパイラからさらに詳しいデバッグ情報を取得する

  • IAR Embedded Workbench IDE > Project > Options...> C/C++ Compiler > List > Output list fileとDiagnosticsを選択
  • IAR Embedded Workbench IDE > Project > Options...> C/C++ Compiler > Diagnostics > Enable remarksを選択

その他の情報

共有オブジェクトとは、モジュール間で共有される関数またはデータオブジェクトのことです。このような共有が2つ以上のモジュールで発生した場合、1つの関数/データオブジェクトのみが保持されます。たとえば、インライン関数がインライン化されない場合があります。これは、これらの関数が共有とマークされていて、各関数の1つのインスタンスしか最終的なアプリケーションにインクルードされないためです。この仕組みは、特定の関数や変数に直接的には関連しないコンパイラ生成コードやデータで、最終的なアプリケーションには1つのインスタンスしか必要とされない場合にも使用されることがあります。

全ての製品名は、それぞれの所有者の商標または登録商標です。

申し訳ございませんが、弊社サイトではInternet Explorerをサポートしていません。サイトをより快適にご利用いただくために、Chrome、Edge、Firefoxなどの最新ブラウザをお使いいただきますようお願いいたします。