• ベストアンサー

64ビットのlinuxで32ビットメモリモデルの指定のしかたを御教えください

大量のメモリを必要とする処理のため、64ビットlinuxの環境でgccを使っております。この環境ですと、当然ポインタが64ビットなのですが、同じ環境で動かすその他のツールはそんなにメモリを使いません。こちらの方はメモリの節約のため、できれば32ビットのメモリモデルを使いたいのです。また、古いプログラムがsizeof(ポインタ) == sizeof(int)が前提で作られているものがあり、いずれ書き直す予定ではありますが、とりあえず動かしてみたいのです。gcc に与えるスイッチの指定などを御教えください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

ど~いうエラーが出ているのかがわからないので適切な回答はできませんが, amd64 を指定してコンパイルされた gcc であれば, デフォルトでは -m32 で 32ビット用, -m64 で 64ビット用のバイナリを生成するはずです. もちろん gcc を作るときに -m32 が無効になっている可能性もありますが. ちなみに手元環境では /lib と /lib64 という 2つのディレクトリがあり, -m32 でコンパイルしたときには /lib のランタイムライブラリが, -m64 でコンパイルしたときには /lib64 のランタイムライブラリとリンクしています. ということで, 可能性としては ・gcc が 32ビット用のバイナリを生成できない: これなら多分「-m32 オプションが無効」とかなんとかのメッセージが出るはず. ・32ビット用のライブラリがない: このときには, 実際にはリンカのエラーになっている. かな. とりあえず -m32 -c で 32ビット用のバイナリが生成できるかどうか確認した方がいいと思う.

moritan2
質問者

お礼

できました。 yum install glibc-devel.i386 yum install libgcc.i386 やはり32ビット版ライブラリがなかったせいでした。 ありがとうございました。

moritan2
質問者

補足

どうやらリンク時のエラーのようです。-cをつけると.oはできていました。 エラーメッセージは以下のとおりです。 /usr/bin/ld: crt1.o: No such file: No such file or directory collect2: ld returned 1 exit status

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

手元の FC3+gcc 3.2.3 では -m32 です.

moritan2
質問者

お礼

#1のお礼にも書きましたとおり、一応は解決しました。 ありがとうございました。 ただ、32ビット環境を使わずに make できるのなら非常に助かります。もし、可能なら御教えください。

moritan2
質問者

補足

-m32はエラーになりました。環境などは#1の補足のとおりです。 gcc -vで出る表示は Reading specs from /usr/lib/gcc/x86_64-redhat-linux/3.4.5/specs Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=x86_64-redhat-linux Thread model: posix gcc version 3.4.5 20051201 (Red Hat 3.4.5-2) です。

回答No.1

試したこともないけどgccで386なり486の最適化オプションを 付けてビルドすればいいのでは? -m386 -m486など (詳しいオプションはmanで) でもx64 Linux環境でそのオプション付けた場合って 32ビットコードで吐き出されたとしても64ビット環境で 動くのかは不明。

moritan2
質問者

お礼

普通の32ビットのx86環境でコンパイルしたものを持っていったら、動いてしまいました。補足のプログラムは32ビット環境でも64ビット環境でも 4 でした。 というわけで一応は解決です。 ありがとうございました。 でも、64ビット環境でも32ビット環境とものを作ることができれば助かります。もし可能なら方法を知りたいです。

moritan2
質問者

補足

-m486とやってみたけど、次のようなテストプログラムで出てくる値は int main() { printf("%d\n", sizeof(void *)); } 8 でした。 もう少し詳しく環境を書いておきます。CPUはopteronでlimuxはCentOS 4.3 x86 64 です。gcc は yum で落としました。

関連するQ&A