Category Archives: 7-1.ファイル・アーカイブ

sizeコマンド


アニメ『マケン姫っ!』(2011)

ハレンチですねえ。

一言感想で終わってしまいました。2(通)も見る予定ですが、おそらくそちらの感想も一言になるかと。

ところで、ハレンチ(破廉恥)をネットで調べると

【破廉恥】
恥を恥とも思わないこと。はじ知らず。鉄面皮。厚顔無恥。

と出てきます。

まあ、ハレンチは元が破廉恥だと思いますが、今ってもうこの意味では使ってないと思います。破廉恥は英語でscandalですが、ハレンチってどうにもscandalには結びつかない気がするんです。ハレンチ学園からですかね。言葉は生きてるので、誤った使い方だとしても、ほとんどの人が誤った意味で使うようになったらそれが正となると思いますが、いつかカタカナのハレンチも辞書に載ってくれると信じてます。

今回は、sizeコマンドです。
名前が簡単なので、簡単なコマンドに見えますが、当てずっぽうに、使ってみます。

takk@deb9:~/tmp$ echo HELLO > a
takk@deb9:~/tmp$ size a
size: a: ファイル形式が認識できません
takk@deb9:~/tmp$ 

sizeコマンドの引数にただのテキストファイルを指定すると怒られます。
何を指定すれば良いのでしょうか。man sizeを確認してみましょう。

takk@deb9:~/tmp$ man size
size(1)                      GNU Development Tools                     size(1)

名前
       size - セクションの大きさとその合計をリストする

書式
       size   [-A|-B|--format=compatibility] [--help]
              [-d|-o|-x|--radix=number] [--target=bfdname] [-V|--version]
              objfile...

説明
       GNU  size ユーティリティは objfile 引数に与えられたオブジェクトファイル
       それぞれに対して、セクションのサイ ズとその合計をリストする。デフォルト
       ではオブジェクトファイルひとつ(書   庫が指定された場合はそれぞれのメン
       バー) について一行の出力を生成する。

manを読むと、sizeに指定するのは、オブジェクトファイルです。

オブジェクトのセクションのサイズを表示するコマンドですね。

sizeなんて名前の付け方、かなり大胆だと思います。このコマンドが生まれた背景を知らないので、想像ですが、当時は、セクションのサイズぐらいしかsizeを連想するものがなかったのかもしれません。そうだとすると、それこそハレンチではないですが、sizeという言葉が持つインパクトに変化があったということになります。

では、sizeコマンド使っていきます。Cのソースから作成したオブジェクトファイルで確認してみましょう。

takk@deb9:~/tmp$ cat t.c
#include <stdio.h>

int main()
{
	printf("HELLO\n");

	return 0;
}
takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ 

a.outができました。

takk@deb9:~/tmp$ ls -l a.out
-rwxr-xr-x 1 takk takk 8632  8月 20 19:20 a.out
takk@deb9:~/tmp$ 

a.outを指定してsizeコマンドを実行。 a.outの場合は、sizeだけでも大丈夫です。

takk@deb9:~/tmp$ size a.out
   text	   data	    bss	    dec	    hex	filename
   1614	    600	      8	   2222	    8ae	a.out
takk@deb9:~/tmp$ 

なんだかよくわからない数字が出ましたね。
textってのは、textセクションのことですが、ちょっと大きすぎてよくわかりません。
もっと簡単なソースにしてみます。

takk@deb9:~/tmp$ cat t.c
char *tmp="12345678";

void test()
{

}
takk@deb9:~/tmp$ gcc -c t.c

では、size。

takk@deb9:~/tmp$ size t.o
   text	   data	    bss	    dec	    hex	filename
     72	      8	      0	     80	     50	t.o
takk@deb9:~/tmp$ 

ソースが簡潔になったので、textセクションのサイズも、なんとなく何のサイズか想像できるようになりましたが、こうなったらとことん簡潔にしてみます。

takk@deb9:~/tmp$ cat t.c
char *tmp="12345678ABC";
takk@deb9:~/tmp$ gcc -c t.c
takk@deb9:~/tmp$ 

はい、もう変数だけです。文字列の終端NULL(0)を入れて、12 Byteです。
変数といっても、この定義方法は、const扱いなので、rodataセクションで、sizeコマンドではtextセクションで表示されると思います。

takk@deb9:~/tmp$ size t.o
   text	   data	    bss	    dec	    hex	filename
     12	      8	      0	     20	     14	t.o
takk@deb9:~/tmp$ 

objdumpで確認。rodataセクションですね。

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

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

セクション .rodata の内容:
 0000 31323334 35363738 41424300           12345678ABC.    
セクション .data.rel.local の内容:
 0000 00000000 00000000                    ........        
セクション .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$ 

ちなみに、変数の定義方法を、
char tmp[100]=”12345678ABC”;
とでもしておけば、今度は書き換え可能の初期値付き変数になるので、dataセクションになると思います。そちらは次回確認することにします。