textセクションに注目。

.text : {
_text_start = . ;
*(.text)
_etext = . ;
} > rom

これは、.textセクションを実行形式ファイルの領域として定義し、MEMORY領域のromに情報を配置するというもの。中身は、全てのオブジェクトファイルの.text領域を指定している。要はプログラムの機械語をromに配置する。ここまではOK。

次に注目が、_text_startと_etextの存在だ。いずれの記述も=右に「.」が記載されているがロケーション・カウンタというもの。なにを意味するかというと、現在のカレントアドレスを示すとのこと。文脈から推測すると、いまメモリのどのアドレスに情報を配置しようとしているのかを表現している。そのアドレスのシンボルとして_text_startと_etextが存在する。

_text_start: .text領域をrom領域に配置し始めるアドレス
_etext: .text領域をrom領域に配置し終わるアドレス

で、このリンカスクリプトに定義されたシンボルは、変数名として参照することができます。具体的には、シンボルを変数名として参照し、変数が配置されている情報を見ることで、そのシンボルのアドレスを知ることができます。

僕の今までの経験の中でソースファイル以外の変数を用いてプログラムを記述するなんてことはないのでとても新鮮。ソースファイルでの実際の記述例は以下。リンクには普段表には見えないところでいろいろと裏技が仕組まれているのだなと思います。

static int init(void)
{
int* ps,pe;
extern int text_start,etext;

ps=&text_start;
pe=&etext;

return 0;
}

次にリンカスクリプトのもう1パターン記述形式を見て、最終的なテーマである静的変数の初期化について取り組んでみたいと思います。