LD「まどか、君はセクションっていう言葉を知ってるかい?
簡単に言うと、リンカがメモリ配置をするときの基準さ」
意外と知らない人が多いかもしれませんが、リンカの仕事は基本的にはメモリ配置の決定とシンボルの名前解決、そして実行ファイルの生成くらいです。
では、どのようにしてメモリの配置を決めているのでしょうか?例えばC言語で確保できるメモリ領域は、「ローカル変数のようにブロックから抜けたら開放されるもの」、「グローバル変数のようにプログラム中ずっと有効なもの」、「malloc()なのでピープ領域から確保してくるもの」などがあります。さらには「プログラム本体」や「書き換えをしないデータ(const付きのデータや文字列リテラル)」もあります。これらのデータをメモリ上に配置するときの基準がセクションです。
時に重要なセクションを次に挙げます。
- .text
- .data
- .bss
- .rodata
プログラム本体が置かれるセクションです。AVRではこのセクションのデータはFlashROMに配置されます。
静的記憶域期間を持つ変数のうち、初期値が与えられているデータが置かれるセクションです。AVRではRAMに配置されます。
.dataとは逆で、静的記憶域期間を持つ変数のうち、初期値が与えられていないデータが置かれるセクションです。このセクションもAVRではRAMに配置されます。
文字列リテラル・const付きの変数などプログラム実行中に値が変わらない変数(定数)が置かれます。AVRでは、ハーバードアーキテクチャのせいでRAMに配置されます。
.dataセクションに配置されたデータはそのままでは値が不定なのでプログラムの最初、main()の前に初期化されます。この初期化コードを生成するのもリンカの仕事です。
.bssセクションはすべての値が0に初期化されます。.rodataセクションについてはAVRの場合はRAMに配置される都合で初期化されます。
AVRでは他にもEEPROMにデータを配置するための.eepromセクションなどがあります。くわしくはこちら。
このような説明をすると、自動記憶域期間や割付記憶域期間を持った変数はどうなるのかと思う人がいるかもしれません。ですが、それらはセクションの話から逸脱するので割愛します。(そもそもリンカの仕事の範囲外)
次回はセクションに関係した怪談を話します。
by Shiozaki