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

このQ&Aに関連する最新のQ&A

A 回答 (3件)

ど~いうエラーが出ているのかがわからないので適切な回答はできませんが, amd64 を指定してコンパイルされた gcc であれば, デフォルトでは -m32 で 32ビット用, -m64 で 64ビット用のバイナリを生成するはずです. もちろん gcc を作るときに -m32 が無効になっている可能性もありますが.


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

この回答への補足

どうやらリンク時のエラーのようです。-cをつけると.oはできていました。
エラーメッセージは以下のとおりです。

/usr/bin/ld: crt1.o: No such file: No such file or directory
collect2: ld returned 1 exit status

補足日時:2006/08/08 14:28
    • good
    • 0
この回答へのお礼

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

ありがとうございました。

お礼日時:2006/08/08 14:48

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

この回答への補足

-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)

です。

補足日時:2006/08/08 08:36
    • good
    • 0
この回答へのお礼

#1のお礼にも書きましたとおり、一応は解決しました。

ありがとうございました。

ただ、32ビット環境を使わずに make できるのなら非常に助かります。もし、可能なら御教えください。

お礼日時:2006/08/08 09:02

試したこともないけどgccで386なり486の最適化オプションを


付けてビルドすればいいのでは?
-m386 -m486など
(詳しいオプションはmanで)

でもx64 Linux環境でそのオプション付けた場合って
32ビットコードで吐き出されたとしても64ビット環境で
動くのかは不明。

この回答への補足

-m486とやってみたけど、次のようなテストプログラムで出てくる値は
int main()
{
printf("%d\n", sizeof(void *));
}

8 でした。

もう少し詳しく環境を書いておきます。CPUはopteronでlimuxはCentOS 4.3 x86 64 です。gcc は yum で落としました。

補足日時:2006/08/08 08:35
    • good
    • 0
この回答へのお礼

普通の32ビットのx86環境でコンパイルしたものを持っていったら、動いてしまいました。補足のプログラムは32ビット環境でも64ビット環境でも
4 でした。

というわけで一応は解決です。

ありがとうございました。

でも、64ビット環境でも32ビット環境とものを作ることができれば助かります。もし可能なら方法を知りたいです。

お礼日時:2006/08/08 09:00

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qgccで64ビット整数

gccでMS-VCの__int64にあたるキーワードはありますか?

Aベストアンサー

確か long long です。

Qif(str=='a' || str=='b' || str=='c')これまとめられませんか?

題名どおりなんですが短縮してかけませんか?

Aベストアンサー

Perlなどではこういうのは正規表現で
if ( str =~ /(a|b|c)/ )

なんていうように書けます.
C言語でも正規表現を使うためのライブラリはある
(正規表現,C言語などのキーワードで検索して探してください)
ので,それを探して使うのもありかもしれません.

Qsizeof(ポインタ)

Windows XP HomeEditionで
VisualC++2008で
sizeof(ポインタ)を調べてみたら、常に4Byteでした。
これはメモリ4GBまでに対応出来るように
という意味でしょうか?

つまり、これが「もしも」5Byteだったら
2^8=256
4GB * 256 =1TB
となり
メモリが1TB(テラバイト)
であっても、表現できることになるのでしょうか?

Aベストアンサー

「ポインタのサイズ=記述可能なアドレスの範囲」という考えは、よほど特殊な言語でない限り、その通りと思います。

ただし「記述可能なアドレスの範囲」と「利用可能なメモリの量」は別ですね。メモリが利用可能になるためには言語としての機能の他に、OSやハードウェアの対応も必要になります。

ちなみに、一般的なPCにWindows XPの32bit版を搭載すると、利用できるメモリは最大3GBになるような気がします。

Q64ビットと32ビットの違い

C言語を使っているのですが、32ビット版のgccでコンパイルして実行できるファイルが、64ビット版のgccだと違う結果が出てきます。どちらのgccでも使える汎用性のあるファイルは書けないのでしょうか?
因みにstdio.h、math.h、stdlib.hのライブラリを使っていて、倍精度(double)と整数(int)を使っています。配列は宣言時に「*a」とでも宣言して、mallocで作っています。
漠然とした質問ですがよろしくお願いします。

Aベストアンサー

ごめ、ソースみてわかる世界じゃないや(笑
むしろ、書いた人すごいなぁ。

LinuxならGDBが動くはずなので
地道にトレースして値のおかしくなる場所を特定して
その結果から推測するしかないですね。

google検索したら日本語マニュアルあったのでぺたり
GDB マニュアル
http://flex.ee.uec.ac.jp/texi/gdb-j/gdb-j_toc.html

Q32ビットレジスタで64ビット空間をアクセスする

char *buf;

_asm mov esi,buf
_asm mov [esi],0x77

bufの先頭アドレスが32ビットを超える位置にある場合に
32ビットしか扱わないコンパイラで可能にする記述を教えてください。

セグメントレジスタとは何でしょうか?

VC++でインラインアセンブラで記述します、よろしくお願いします。

Aベストアンサー

> >・・・OSの役割を、・・・
> パソコンの基礎を学んでいない素人ですので、よろしくお願いします。

いや、逆ですよ。
やりたい事なために自分で学ばないといけないんです。
環境や人の性にしてはいけません。
そもそも、こんな所の基礎を教えてくれるところなんて情報工学系の大学くらいです。
※ それでも情報工学系の大学生の多くの人は、優秀な人を除いてちゃんと理解できているか怪しいですが。

基礎をすっとばすから訳が分からなくなるんです。
言い訳じゃなく、自分でやるべき事(OSとCPU動作を基礎から勉強)をやってください。


人気Q&Aランキング

おすすめ情報