バイナリファイルの中身がそのまま ROM へコード/データとして書き込まれます。 この ROM に書き込まれたプログラムがプログラム実行前に位置しているアドレスを「ロードアドレス」といいます。
実行を開始したら、まずスタートアップルーチンが RW セクションの初期化データ(初期定数が有り、定数が ROM に書き込まれている場合)を RAM 領域にコピーし、更に ZI セクション(初期値ゼロの変数等)をRAM 領域に作成します。 この実行中にコード/データが位置するアドレスを「実行アドレス」といいます。
main() 関数を使用しない場合、ユーザがスタートアップルーチンを作成する必要があります。 そして、そのスタートアップルーチンが ROM 領域の初期値を RAM 領域にコピーし、ZI セクションを RAM 領域に作成する必要があります。
main() 関数を使用して、且つ、scatter-loadingを使用している場合は、scatterファイルで定義したロードアドレスと実行アドレスがリンク時に利用されて、スタートアップルーチンが生成されます。 そして、実行時にそのスタートアップルーチンが実行されて実行アドレスに RW セクションが配置されます。
一方、main() 関数を使用せずに scatter-loadingを使用している場合、scatterファイルで定義したロードアドレスと、実行アドレスが、リンク時にシンボルとして生成されます。ユーザは、そのシンボルを利用して、ユーザ独自のスタートアップルーチンを作成し、その実行時に RW セクションを配置する必要があります。