8

.rdataセクションとセクションの意味を理解しようとしてい.textます。以下のような簡単なプログラムを試しています

int main()
{
    const int a = 10;
    printf("%d\n", a);
    return 0;
}

mapファイルをビルドしてダンプし、 をgcc -o a.out sample.c -Wl,Map,test.map検索するとsample.o、次の割り当てが見つかります

.text          0x0040138c       0x34 sample.o
.data          0x00402000        0x0 sample.o
.rdata         0x00403064        0x8 sample.o
.eh_frame      0x00404060       0x38 sample.o
.bss           0x00405020        0x0 sample.o

ここで、プログラムを少し変更してa、グローバル変数を

const int a = 10;
int main()
{
     printf("%d\n", a);
     return 0;
}

上記と同じ手順を繰り返すと、割り当てが次のようになっていることがわかります

.text          0x0040138c       0x2c sample.o
.data          0x00402000        0x0 sample.o
.rdata         0x00403064        0xc sample.o
.eh_frame      0x00404060       0x38 sample.o
.bss           0x00405020        0x0 sample.o

セクションにa割り当てられていることを明確に示しています.rdata

.rdata         0x00403064        0xc sample.o
               0x00403064            a

これらの実験から、セクションのサイズが小さくなっているのに対し、セクションにglobal const割り当てられていることがわかります。したがって、最初の例でセクションに割り当てられたと思います。.rdata.texta.text

私の質問は次のとおりです。

  1. constまたは内の場所を決定する際に、変数のスコープは考慮されます.rdata.text?

  2. 私の実験から、変数が.textセクションに割り当てられた場合、セクション内の 4 バイトと比較して、変数に 8 バイトが必要であることがわかりました.rdata。この違いの理由は何ですか?

  3. constローカル変数が多すぎると、対応する.textセクションのサイズが大幅に増加します。このシナリオで推奨されるプログラミング方法は何ですか?

よろしくお願いします。

4

2 に答える 2

9

最初のケースでは、変数はローカル変数として宣言されています。「自動」保存期間があります。つまり、囲んでいるスコープの最後に消えます。保存期間があるため、メモリの一部を永続的に占有することはできません (これは に関係なく当てはまりますconst)。したがって、通常はスタックまたはレジスタに格納されます。

2 番目のケースでは、変数はグローバル変数として宣言されます。静的な保存期間があるため、プログラムの存続期間中持続します。.dataこれは、 、.bss.text、または.rdata(または)など、多くの場所に保存できます.rodata

.data一般に、global などの事前定義された (ゼロ以外の) コンテンツを含む書き込み可能な静的データに使用されますint foo = 42;.bssゼロに初期化された(または初期化されていない)書き込み可能な静的データに使用されます。文字列や変数rdataなどの一定の静的データに使用されます。constもちろん、これらの使用はすべて「一般的」であり、コンパイラごとに異なる場合があります。

では、なぜ.text最初のケースで大きくなったのでしょうか? これは10、スタックまたはレジスターにロードするために、コンパイラーが追加の命令を生成する必要があったためです。

于 2013-04-16T00:27:02.997 に答える