「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)
簡単ですが以上になります。