2017-08-27 12 views
2

以下に示すように、私は、GCC v5.2.1を使用してプログラムをコンパイル..デフォルトでBSSとデータセグメントにはどのようなデータがありますか?

int main() 
{ 
    return 0; 
} 

を単純なCプログラムを開発しました。私はUnixのコマンドを実行した「サイズ」以下の実行ファイルにそれが表示されたサイズです。..データセクション私の理解あたりとして

テキスト= 1131、データ= 552、BSS = 8

初期化されたグローバルデータを保持し、BSSは初期化されていないグローバルデータを保持する。グローバル変数はありませんが、なぜ 'data'セクションと 'BSS'セクションにゼロ以外の値が表示されるのですか?

+1

プログラムにリンクされたランタイムコードがたくさんあります。例えば、スタートアップコード* –

+0

@ FelixPalmen右どちらのセグメントにも正確に何のデータがありますか? –

+3

これはターゲットプラットフォームと実行時タスク'main()'を呼び出す前に実行しなければなりません。 p 'agrv []'などがあります。ほとんどの場合、明示的に初期化しないデータは '.bss'に置かれるため、プログラムが起動する前に' 0'に設定されなければならないので、初期化ループが必要です。pp。 –

答えて

2

一言で言えば、あなたの最終的なプログラムはより多く、コードが書いている部分よりも多いからです。ランタイムは、たとえば、 main()argvのデータの入力、.bssのデータの初期化など)および終了後のクリーンアップを呼び出す前に必要なすべての設定を行います。このコードで正確に行われることは、あなたの実装に完全に依存します。

+0

意味があります。実装では、私のコンパイラ、すなわち追加コードを追加する方法を意味しますか?私はそれを確認することができますどのような方法ですか?私はgcc v5.2.1を使用します。あなたはいくつかのヒントを提供できますか? –

+0

gccはオブジェクトファイル 'crt * .o'を使用して実行可能ファイルに直接リンクします(' crt'は "C runtime"を意味します)。私のLinuxシステムでは、 '/ usr/lib/gcc/x86_64-linux-gnu'にあるので、あなたのシステムのパスは変わるかもしれません。どのようにコンパイルするかによって、 'libgcc.a'もリンクされます。 –

0

質問に答える:スタートアップコードには独自のデータがあります。そのデータはこの例に示されています。

セグメントがどのように呼び出されるかは実装定義されていますが、多くのスタートアップコード&リンカスクリプトがこの最も一般的なものを使用します。

の.text - あなたのプログラムコード

に.rodata - ROデータのみ - たとえば、文字列リテラルのため。多くのimplemetationsがそこに行くだろうconstconst 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、スタートアップ時にコピーされ

関連する問題