2017-09-12 20 views
1

私は64ビットのubuntuを使っていますが、私は以下のように様々な変数のためのbssのサイズを探しています。なぜ初期化されていないグローバル変数を追加してもsizeコマンドで表示されるbss値が増加しないのですか?

最初のプログラム:

#include <stdio.h> 
main() 
{ 
} 

サイズコマンドは、上記のプログラムによって生成された実行のために結果の下に与えています。

text  data  bss  dec  hex filename 
1115  552  8 1675  68b a.out 

第2のプログラム:

#include <stdio.h> 
int a = 10; 
main() 
{ 
} 

サイズコマンドは、上記のプログラムによって生成された実行のために結果の下に与えています。

text  data  bss  dec  hex filename 
1115  556  4 1675  68b a.out 

第3のプログラム:

#include <stdio.h> 
int a; 
main() 
{ 
} 

サイズコマンドは、上記のプログラムによって生成された実行のために結果の下に与えています。

text  data  bss  dec  hex filename 
1115  552  8 1675  68b a.out 

注:

コンパイル中に、私はどのフラグを使用していません。

下記の質問にお答えください。

1) Why bss is 8 bytes for first program even though there are no uninitialized global or static variables? 
2) Why bss is reduced to 4 bytes when I added initialized global variable in second program? 
3) Why bss is showing 8 bytes for the third program? 
4) What are dec and hex in the output given by size command? 
+0

あなたのプログラムは何もしていないので、この変数はおそらく最適化されています。 –

+0

さまざまなセグメントのサイズがソースコードだけで完全に決定されているかのように質問します。実際、コンパイラと(特に)リンカはこの分野で大きな寛容さを持っています。 –

+0

どのコンパイラフラグを使用しましたか?そして、 'objdump -x a.out'は何を言いますか? – rustyx

答えて

2

これはあなたの同僚です。私はあなたの答えを伝えることができる前に退去しました。

1) 初期化されていないグローバル変数または静的変数がないのに、なぜbssが最初のプログラムの8バイトであるのですか?

私はこれについて明確な答えはありません。私は、コンパイラが何かのために4バイトを使用していると思うし、データセグメントがすでに69 * 8 = 552であるため、bssのために完全な8バイトを割り当てる必要があります。

2)2番目のプログラムで初期化されたグローバル 変数を追加すると、なぜbssが4バイトに減少するのですか?あなたのプログラムが唯一のコンパイラはデータセグメントにBSSから未使用のバイトをとり、変数のための4つのバイトを必要とするため

データ+のBSSは常に8の倍数になります。

3)なぜbssが3番目のプログラムで8バイトを表示していますか?

これは、変数を初期化していないときに1と2に戻ります。これはbssに入れられています。この時点でのbssには2つの変数( "a" +内部コンパイラ変数)があります。これをテストするには、初期化されていない変数を追加します。追加する変数はすべて(bssが4の場合は最初のものから始まります)、bssが8ずつ増加します。

4)sizeコマンドの出力のdecとhexは何ですか?

データ+テキスト+ BSS = 12月、六角

この情報がお役に立てば幸いで同じ値。 詳細を知りたい場合は、私の机でスイングしてください。

+0

ありがとうSnickySnacks。私は明日あなたの机に立ち寄ります。 – kadina

関連する問題