6.1.1 C/C++プログラムのセクション

C/C++プログラム、標準ライブラリの使用メモリ領域の種類とセクションとの対応を表3.29に示します。

表 6.1

メモリ領域の種類とその性質の概要

No.

名称

セクション

形式

種別

初期値

アライ

メント数

内容

名称

属性

書き込み操作

1

プログラム領域

P *1 *6

code

相対

不可

1byte *7

機械語を格納

2

定数領域

C *1 *2 *6 *8

romdata

相対

不可

4byte

const型のデータを格納

C_2 *1 *2 *6 *8

romdata

相対

不可

2byte

C_1 *1 *2 *6 *8

romdata

相対

不可

1byte

3

初期化データ領域

D *1 *2 *6 *8

romdata

相対

4byte

初期値のあるデータを格納

D_2 *1 *2 *6 *8

romdata

相対

2byte

D_1 *1 *2 *6 *8

romdata

相対

1byte

4

未初期化データ領域

B *1 *2 *6 *8

data

相対

4byte

初期値のないデータを格納

B_2 *1 *2 *6 *8

data

相対

2byte

B_1 *1 *2 *6 *8

data

相対

1byte

5

switch文分岐テーブル領域

W *1 *2

romdata

相対

不可

4byte

switch文の分岐テーブルを格納

W_2 *1 *2

romdata

相対

不可

2byte

W_1 *1 *2

romdata

相対

不可

1byte

6

C++初期処理/後処理データ領域

C$INIT

romdata

相対

不可

4byte

グローバルクラスオブジェクトに対して呼び出されるコンストラクタおよびデストラクタのアドレスを格納

7

C++仮想関数表領域

C$VTBL

romdata

相対

不可

4byte

クラス宣言中に仮想関数があるときに仮想関数をコールするためのデータを格納

8

ユーザスタック領域

SU

data

相対

4byte

プログラム実行に必要な領域

9

割り込みスタック領域

SI

data

相対

4byte

プログラム実行に必要な領域

10

ヒープ領域

相対

ライブラリ関数malloc、realloc、calloc、newで使用する領域 *9

11

絶対アドレス変数領域

$ADDR_

<section>_

<address> *3

data

絶対

有/無

可/不可

*4

#pragma address指定した変数を格納

12

可変ベクタ領域

C$VECT

C$VECT<ベクタテーブル番号>

romdata

相対

4byte

可変ベクタテーブル

13

リテラル領域

L *5

romdata

相対

可/不可

4byte

文字列リテラルおよび集成体の動的初期化で用いる初期化子を格納

注 1.

sectionオプションでセクション名を切り替えることができます。

注 2.

セクション名切り替えの際に、アライメント数が4のセクションを指定することで、アライメントが1または2のセクション名も変更されます。

注 3.

<section>はC,D,Bのセクション名称、<address>は絶対アドレス値(16進数)になります。

注 4.

初期値、書き込み操作は<section>の属性に従います。

注 5.

sectionオプションでセクション名を変更することができます。このとき、変更後の名前にCセクションを選択することも可能です。

注 6.

#pragma sectionでセクション名を変更することができます。

注 7.

instalign4オプション、instalign8オプション、#pragma instalign4 または #pragma instalign8のいずれかを使用すると、アライメント数は4または8になります。

注 8.

#pragma endianでendianオプションと異なる指定のエンディアンを指定した場合、#pragma endian big であれば_Bを、#pragma endian little であれば_Lを、セクション名の後ろに付加した専用のセクションを生成し、該当データを格納します。

注 9.

これらの関数を使用するためには、最小で16バイトのヒープ領域が必要です。

例 1.

Cプログラムとコンパイラ生成セクションとの対応をプログラム例を用いて示します。

Cプログラム

int a=1;
char b;
const short c=0;
void main(){
 ...
}

 

コンパイラが生成する領域と格納されるデータ

セクション名

プラグラム領域 (main(){...})
P
定数領域 (c)
C_2
初期化データ領域 (a)
D
未初期化データ領域 (b)
B_1

 

例 2.

C++プログラムとコンパイラ生成セクションとの対応をプログラム例を用いて示します。

C++プログラム

class A{
  int m;
  A(int p);
  ~A();
};
A a(1);
char b;
extern const char c='a';
short d=1;
void f(){...}

 

コンパイラが生成する領域と格納されるデータ

セクション名

プログラム領域 (f(){...})
P
定数領域 (c)
C_1
初期化データ領域 (d)
D_2
未初期化データ領域 (a)
未初期化データ領域 (b)
B
B_1
初期処理/後処理データ領域 (&A::A, &A::~A)
C $INT