絶対番地に配置された変数

テクニカル・ノート 43262

アーキテクチャ:

All

コンポーネント:

compiler

更新日:

2018/05/16 7:21

はじめに

このテクニカルノートでは、絶対番地に配置される変数の取り扱いについて説明します。

問題点

リンカが、"an absolute located variable has not been defined" (絶対アドレスに配置された変数が定義されていません)というエラーを表示することがあります。これは、このような変数を定義するための非直感的な方法に関連していることがあります。

解決策

変数を参照しているすべてのソースファイルからインクルードされるヘッダーファイルの中で、変数を定義し配置します。

背景/追加情報

絶対アドレスにある変数は、通常のC / C ++の非自動変数に比べてわずかに異なる動作をします。

絶対アドレスに配置される変数は、ABSOLUTE や xxxx_AN などの絶対セグメントに配置されます。 変数はコンパイル時にすでに配置されているため、絶対セグメントはリンカファイルには存在しません。

ファイルスコープを持つ他の(通常の)非自動変数は、再配置可能なセグメントに配置されます。このセグメントは、通常どおりリンカファイルに記述する必要があります。 これは、リンク時にアドレス解決が行われるためです。

非自明な動作:

それぞれの絶対配置された変数定義は実際には現在のコンパイル単位(ファイル)に対してローカルなので、その変数にアクセスする各コンパイル単位で定義を持つ必要があります。 複数のそのような定義は、リンク時に衝突しません(一貫した方法で変数を定義した場合、つまり定義するすべてのモジュールにおいて同一定義である場合)。 絶対配置された変数が使用されない場合は、そのコンパイル単位から変数は破棄されます。 変数が使用されている場合、次の2 つの理由のため、変数は出力ファイル内に存在されます。変数は出力ファイルに含まれます。1つめの理由は、リンク段階で変数は絶対位置を主張する必要があります。もう一つの理由は、定義がすべてのモジュールで一貫しているかどうかをリンカがチェックするためです。

言い換えれば、複数のファイルから変数が使われる場合は、定義はヘッダファイルに配置される必要があります(通常のような宣言ではなく):

setup.h:

__no_init struct setup configuration @ 0x100;

そして、この変数にアクセスする全てのソース ファイルで setup.h ファイルをインクルードします。

これを覚えておく一つの方法は、リンカが一貫性をチェックできるようにすることに加えて、メモリの場所を記述する#defineを持つと考えることです。

オブジェクトを名前付きセグメントに配置する場合:

__no_init struct setup located_configuration @ "SETUP";

次にセグメントSETUPをリンクファイル内に定義、配置する必要があります。 セグメントに配置された変数は、通常のC変数としてふるまいます。ヘッダーファイルに宣言を挿入します:

setup.h:

extern __no_init struct setup located_configuration;

そして、1 つ (1 つだけ) のソースファイルに定義を置く必要があります:

__no_init struct setup located_configuration @ "SETUP";

@-構文を使用したくない場合は、同じ意味の

#pragma location=

を代わりに使用することができます。

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

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