読者です 読者をやめる 読者になる 読者になる

のぴぴのメモ

自分用のLinuxとかの技術メモ

32bitと64bitプロセスのtime_tのbitsを実機確認してみる

Linux Cプログラム

32bitプロセスと64bitプロセスで、glibcのtime_t変数のビット数がどう違うのか確認してみました。

サンプルプログラム

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

#define sizeof_bits(x) (int)sizeof(x)*8

int main()
{

      printf("char      size:= bits\n",sizeof_bits(char));
      printf("int       size:= bits\n",sizeof_bits(int));
      printf("long      size:= bits\n",sizeof_bits(long));
      printf("long long size:= bits\n",sizeof_bits(long long));

      printf("struct timeval {        ->size:= bits\n",sizeof_bits(struct timeval));
      printf("   time_t      tv_sec;  ->size:= bits\n",sizeof_bits(time_t));
      printf("   suseconds_t tv_usec; ->size:= bits\n",sizeof_bits(suseconds_t));
      printf("}\n");

      return(EXIT_SUCCESS);
}

実機確認

(1)コンパイル、(2)fileコマンドで32bitのバイナリ形式であることを確認、(3)実行してビット数を確認の流れです。
time_tが32bitプロセスの場合は32bit、64bitプロセスの場合は64bitであることが解ります。
ちなみに、32/64bitプロセスで、char、int、long long型は差異が無く、long型が32/64bitでそれぞれ差異がある事も確認できます。

32bitプロセスの場合

  1. long変数が、32bitである。
  2. time_tも、32bitである。
$ gcc -m32 -o time-32 time.c
$ 
$ file time-32
time-32: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=e4d3d5ef99b4f5178372ff254729b284fc429946, not stripped

$ ./time-32 
char      size:  8 bits
int       size: 32 bits
long      size: 32 bits
long long size: 64 bits
struct timeval {        ->size: 64 bits
   time_t      tv_sec;  ->size: 32 bits
   suseconds_t tv_usec; ->size: 32 bits
}

64bitプロセスの場合

  1. long変数が、64bitである。
  2. time_tも、64bitである。
$ gcc -m64 -o time-64 time.c
$
$ file time-64
time-64: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=dc935a4fb6c31c98544e90fc740d59cd4b9db081, not stripped

$ ./time-64
char      size:  8 bits
int       size: 32 bits
long      size: 64 bits
long long size: 64 bits
struct timeval {        ->size:128 bits
   time_t      tv_sec;  ->size: 64 bits
   suseconds_t tv_usec; ->size: 64 bits
}

蛇足

glibcのコード上からも裏付けとろうと思ったのですが、時間がないのでやめました。