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$
どうやら変数が使用されていないので、どこにも確保されていなかったようです。
コメント