「C」64bit のGCC で 32bit アプリケーションを作成する環境構築 ( CentOS 6.4 )

64bit のGCC で 32bit アプリケーションを作成する環境構築のメモです。

まぁ、やることとしては、以下のページに記載の通りに glibc-devel.i686 glibc-devel libstdc++-devel.i686 パッケージを yum でインストールするだけ。
※ もしかしたら glibc-devel は指定必要ないかもです。

・HowTo Compile a 32-bit Application Using gcc On the 64-bit Linux Version
http://www.cyberciti.biz/tips/compile-32bit-application-using-gcc-64-bit-linux.html

1.パッケージのインストール


yum -y install glibc-devel.i686 glibc-devel libstdc++-devel.i686


2.32bit アプリケーションの作成


なんでもいいんですが、今回は long 型とポインタのサイズを表示するアプリケーションとしました。
■ test.c

#include <stdio.h>

void main()
{
  long l;
  int *p;
  printf("size of long    : %d\n" ,sizeof(l));
  printf("size of pointer : %d\n" ,sizeof(p));
}


以下みたいに普通にコンパイルすると当然 64bit アプリケーションになるので、それぞれのサイズは 8 バイトになる。

# gcc -o 64test test.c 
# ./64test 
size of long    : 8
size of pointer : 8


32bit アプリケーションの作成は -m32 オプションをつけることで可能。それぞれのサイズ 4 バイトになってますね。

# gcc -m32 -o 32test test.c 
# ./32test 
size of long    : 4
size of pointer : 4


32bit か 64bit かは file コマンドでも確認できます。

# file 64test
64test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

# file 32test 
32test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped


ldd の結果は以下のとおりです。あんまり詳しくないですが、それぞれ 64bit、32bit のライブラリにリンクされている感じですかね。

# ldd 64test 
        linux-vdso.so.1 =>  (0x00007fffdceb0000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb5160d6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb51647b000)
# ldd 32test 
        linux-gate.so.1 =>  (0x004ec000)
        libc.so.6 => /lib/libc.so.6 (0x00a91000)
        /lib/ld-linux.so.2 (0x00ed1000)


簡単ですが以上になります。

[ 環境情報 ]
CentOS 6.4
GCC 4.4.7