sizeコマンドでdata,bssを確認する

sizeコマンド続きです。

前回のおさらい。文字列をchar*変数だけどrodataで、sizeの表示はtext。

takk@deb9:~/tmp$ cat t1.c
char *tmp="123456789";
takk@deb9:~/tmp$ gcc -c t1.c
takk@deb9:~/tmp$ 
takk@deb9:~/tmp$ size t1.o
   text	   data	    bss	    dec	    hex	filename
     10	      8	      0	     18	     12	t1.o
takk@deb9:~/tmp$ 

constをつけても、同じ。

takk@deb9:~/tmp$ cat t2.c
const char *tmp="123456789";
takk@deb9:~/tmp$ gcc -c t2.c
takk@deb9:~/tmp$ 
takk@deb9:~/tmp$ size t2.o
   text	   data	    bss	    dec	    hex	filename
     10	      8	      0	     18	     12	t2.o
takk@deb9:~/tmp$ 

配列変数にすると、dataになる。

takk@deb9:~/tmp$ cat t3.c
char tmp[100]="123456789";
takk@deb9:~/tmp$ gcc -c t3.c
takk@deb9:~/tmp$ 
takk@deb9:~/tmp$ size t3.o
   text	   data	    bss	    dec	    hex	filename
      0	    100	      0	    100	     64	t3.o
takk@deb9:~/tmp$ 

配列の添え字を指定しないと、文字列の長さで自動的に割り当たる。

takk@deb9:~/tmp$ cat t4.c
char tmp[]="123456789";
takk@deb9:~/tmp$ gcc -c t4.c
takk@deb9:~/tmp$ 
takk@deb9:~/tmp$ gcc -c t4.c
takk@deb9:~/tmp$ size t4.o
   text	   data	    bss	    dec	    hex	filename
      0	     10	      0	     10	      a	t4.o
takk@deb9:~/tmp$ 

配列だけ用意して、中身を入れないとどうなるか。bssでしょう。

takk@deb9:~/tmp$ cat t5.c
char tmp[100];
takk@deb9:~/tmp$ gcc -c t5.c
takk@deb9:~/tmp$ 

あれ? bssに配置されていません。何故?
bssは初期化しない変数の領域なので、100と表示されてもいいはずなのに。

takk@deb9:~/tmp$ size t5.o
   text	   data	    bss	    dec	    hex	filename
      0	      0	      0	      0	      0	t5.o
takk@deb9:~/tmp$ 

objdumpで確認。

takk@deb9:~/tmp$ objdump -s t5.o

t5.o:     ファイル形式 elf64-x86-64

セクション .comment の内容:
 0000 00474343 3a202844 65626961 6e20362e  .GCC: (Debian 6.
 0010 332e302d 31382b64 65623975 31292036  3.0-18+deb9u1) 6
 0020 2e332e30 20323031 37303531 3600      .3.0 20170516.  
takk@deb9:~/tmp$ 

どうやら変数が使用されていないので、どこにも確保されていなかったようです。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA