質問に答える:スタートアップコードには独自のデータがあります。そのデータはこの例に示されています。
セグメントがどのように呼び出されるかは実装定義されていますが、多くのスタートアップコード&リンカスクリプトがこの最も一般的なものを使用します。
の.text - あなたのプログラムコード
に.rodata - ROデータのみ - たとえば、文字列リテラルのため。多くのimplemetationsがそこに行くだろうconst
(const int x[2] = {1,2};
)とそこにオブジェクトを置く
.bssの - Cで
、明示的な初期化子のない静的に割り当てられたオブジェクトは をしている(つまりグローバル)静的記憶して初期化されていないデータゼロ(算術型の場合)またはヌルポインター( ポインタータイプの場合)に初期化されます。 Cの実装は、通常、 のゼロ値と、ゼロ値のビット のみからなるビットパターンを使用するヌルポインタ値を表します(これはC標準では必要ありません)。 したがって、BSSセグメントは、典型的に (変数および定数の両方)は、ファイルスコープ(すなわち、 任意の関数外)ならびに初期化されていない静的なローカル変数(ローカル 変数は静的キーワードで宣言)で宣言されたすべての初期化されていないオブジェクトを含みます。静的ローカル定数 は、宣言時に初期化する必要がありますが、 の別の宣言がないため、暗黙的または明示的にゼロに初期化されていますが、通常BSSセクションの にはありません。 実装では、静的に割り当てられた変数と、 の定数を、BSSセクションへの0の値の ビットのみで構成される値で初期化することもできます。 .DATA
-
.DATAセグメントは 事前定義された値を有しており、変更することができる任意のグローバルまたは静的変数を含みます。これは、関数内で定義されていない の変数であり、関数内で定義されていますが、静的変数として定義されているため、その後の呼び出しではアドレスが になります。
例:リテラル
static char x[] = "Hello world";
文字列「」Hello World」の.rodataのセグメントに格納され、それは.DATAセグメントに位置チャーテーブルX、スタートアップ時にコピーされ
プログラムにリンクされたランタイムコードがたくさんあります。例えば、スタートアップコード* –
@ FelixPalmen右どちらのセグメントにも正確に何のデータがありますか? –
これはターゲットプラットフォームと実行時タスク'main()'を呼び出す前に実行しなければなりません。 p 'agrv []'などがあります。ほとんどの場合、明示的に初期化しないデータは '.bss'に置かれるため、プログラムが起動する前に' 0'に設定されなければならないので、初期化ループが必要です。pp。 –