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

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と関連する良く見られている質問

Qエラー発生アプリケーション mmc.exe

管理ツールのイベントログを見たり、保存したりすると、管理ツールが落ちてしまいます。
何とか、落ちながら保存された、イベントログには
「エラー発生アプリケーション mmc.exe、バージョン 5.1.2600.0、エラー発生モジュール mmcndmgr.dll、バージョン 5.1.2600.0、エラー発生アドレス 0x00054e27」
とあります。
何が壊れているんでしょうか。

Aベストアンサー

mmc.exeは管理ツール。mmcndmgr.dllはそのアイコン・ファイルのようですが。回答になっていませんね。
http://www.zdnet.co.jp/magazine/pcjapan/0009/sp4/08.html

参考URL:http://www.zdnet.co.jp/magazine/pcjapan/0009/sp4/08.html

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

Q"mmc.exe"ってどんな働きをするのでしょうか?エラーメッセージが表示されるのですが...

本日2度ほど"mmc.exe"のアプリケーションエラーが発生しました。
表示メッセージは次のようなものでした。
"0x77a5db1"の命令が"0x72392d74"のメモリを参照しましたが、メモリが"read"になることはできませんでした。
発生したのはACCESS2000でテキストファイル(6MB位の大きいもの)にリンクを貼ろうとした際、ACCESSの反応がなくなっため、強制終了してからです。
何らかの修復をしなければならない重要なメッセージなのかどうかわからず質問させていただきました。
mmc.exeで検索したところ、2件ほどヒットしましたが、今回の私の事象とは異なったため、質問しました。
よろしくお願いします。

Aベストアンサー

mmcはMicrosoft Management Consoleです。
MSの検索でMMCで検索すれば何個か文献が出るでしょう。
ヘルプ見ても出てくるはずです。
コントロールパネルの管理ツール内のアプレットはたいていMMCのコンソール
だったはず。

解決策はやはりとりあえずSP2当てて様子を見るというのは(Windows2000ならば)。

参考URLはSP2のダウンロードページです。

参考URL:http://www.microsoft.com/japan/windows2000/downloads/servicepacks/sp2/default.asp

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

char *buf;

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

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

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

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

Aベストアンサー

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

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

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

Qこのホ-ムペ-ジでの質問一覧画面がエラーで出ない

このホ-ムペ-ジですが
マイページ → 関心カテゴリーの質問一覧
を押してもエラ画面ーになり表示出てきません
自分の質問解答履歴は出ます
なぜエラーに ???
宜しくお願い致します

Aベストアンサー

エラーが続出していますね。
更新ボタンを押すと表示されることが多いです。

Q32ビットのアプリで、64ビットOSのシステムフォルダ先のiniファイルを読み込むには

お世話になります。
C#2005で開発しております。

WinXPで作成したexeで、C:\Windows\System32の下のiniファイルを読み込んでおります。
このexeを64bit版Win2008Serverで実行したいのですが、
C:\Windows\SysWOW64にインストーラーで作成されたiniファイルを以下のコードで読み込むことが出来ません。

string strIniFilePath = Environment.SystemDirectory + "\\****.INI";

64bit版で32ビットのものを実行する場合は、C:\Windows\SysWOW64に読み込みをしなければならないと認識しております。
また、64bit版Win2008Serverのsystem32フォルダに置くと、読み込むことが出来ます。
iniファイルはdllと違い、system32の下に置かなければいけないのでしょうか。

お手数ですが、ご教授いただきたくお願い申し上げます。

Aベストアンサー

http://itpro.nikkeibp.co.jp/article/COLUMN/20051121/224935/

「そこで64ビットWindows(WOW64)は,32ビット・アプリケーションが,例えばC:\WINDOWS\system32にアクセスすると,C:\WINDOWS\SysWOW64にリダイレクトする(図14[拡大表示])。」
と言うのが重要。

つまり
・32ビットアプリケーションは、インストーラーにより、C:\Windows\SysWOW64にインストールしなければならない
・32ビットアプリケーションをC:\Windows\System32にインストールしてはならない(iniファイルも然り。C:\Windows\System32に32ビット用iniファイルを置いてはならない)
・32ビットアプリケーションは、C:\Windows\SysWOW64にアクセスする場合は、C:\Windows\System32にアクセスし、WOW64によってリダイレクトして貰わねばならない
・32ビットアプリケーションは、C:\Windows\SysWOW64にアクセスするようなハードコーディングをしてはならない
って事です。

なお、
string strIniFilePath = System.Environment.GetFolderPath(Environment.SpecialFolder.System) + "\\****.INI";
の方が安全です。

http://itpro.nikkeibp.co.jp/article/COLUMN/20051121/224935/

「そこで64ビットWindows(WOW64)は,32ビット・アプリケーションが,例えばC:\WINDOWS\system32にアクセスすると,C:\WINDOWS\SysWOW64にリダイレクトする(図14[拡大表示])。」
と言うのが重要。

つまり
・32ビットアプリケーションは、インストーラーにより、C:\Windows\SysWOW64にインストールしなければならない
・32ビットアプリケーションをC:\Windows\System32にインストールしてはならない(iniファイルも然り。C:\Windows\Syst...続きを読む

Qホームページビルダー11で通信エラー(エラーコード:553)がサイト転送時に出ます。

 こんにちは。ホームページビルダー11でサイト転送すると通信エラ
ー(エラーコード:553)が出て、フレーム表示のページも表示され
ていない状態になってしまいます。どうしたらよいですか?

Aベストアンサー

こちらがご参考になるかと

V11 で転送時に「転送エラー」ダイアログが表示されます
http://www-06.ibm.com/jp/domino01/swhc/esupport.nsf/key/49256A6A0001F136492572350006E350?opendocument

FTPのエラーメッセージの553ですと、「ファイル名の文法エラー、ファイル名が間違っているため実行できない」という意味ですので
この場合、大抵はファイル名に半角英数以外を使用しているのが原因トモ考えられますので、ご確認を。
ファイル名に使用できるのは半角英数と_-のみです。

ただ、どうもV11の不具合でもあるようですので、ファイル名に問題がない時は、サイト転送ではなくページ転送(FTP)や、フリーソフトのFFFTPなどを使って転送してみた後、ネット上で表示されるかどうか確認するのをおすすめします。

また、後日V11の修正ファイルがIBMで配布されると思いますので、たまに下記サイトをアクセスし、修正ファイルが公開されたらインストールされておかれてください。
http://www-06.ibm.com/jp/software/internet/hpb/

参考URL:http://www-06.ibm.com/jp/domino01/swhc/esupport.nsf/key/49256A6A0001F136492572350006E350?opendocument

こちらがご参考になるかと

V11 で転送時に「転送エラー」ダイアログが表示されます
http://www-06.ibm.com/jp/domino01/swhc/esupport.nsf/key/49256A6A0001F136492572350006E350?opendocument

FTPのエラーメッセージの553ですと、「ファイル名の文法エラー、ファイル名が間違っているため実行できない」という意味ですので
この場合、大抵はファイル名に半角英数以外を使用しているのが原因トモ考えられますので、ご確認を。
ファイル名に使用できるのは半角英数と_-のみです。

ただ、どうもV11の不...続きを読む

QC言語について質問です。 C言語のビット演算で10進数の1を左に1ビットずつずらしていって32ビット

C言語について質問です。


C言語のビット演算で10進数の1を左に1ビットずつずらしていって32ビットで表示するプログラムを書いてるんですが…最後の値が負になってしまいます。
変数の型はunsigned にしているんですが。どうしてでしょうか?

Aベストアンサー

おそらく、printf() しょ書式指定子が、 %ud ではなくて、 %d になっているためです。

ちなみに、左シフトの場合、signed でも unsigned でも、操作自体は変わりません。
(右シフトは符号の扱いがある)

それを、表示するときに、符合付きと見なすか符号無しと見なすかです。

QWindows1032bitアップデート中にエラーが出ました。second-boot フェーズでエラ

Windows1032bitアップデート中にエラーが出ました。second-boot フェーズでエラーが出ました!全く意味がわかりません?

Aベストアンサー

windows10、windows10anniversary Updateに失敗をする場合は、
タスクトレイを開いてタブのスタートアップを開いて、すべてのアプリを無効にします。
次にもサービスを開いて、Microsoftの製品をすべて無効にします。

windows10 Creators Updateに失敗をする原因
http://freesoft.tvbok.com/win10/problems/trouble_shoot_list_creators_update.html

私のプロフィールにwindowsに関するURLを載せているので、必要な時にURLを開いて操作方法を確認してください。

Q16ビットDLLから32ビットDLLをコールする方法

現在VC++で「16ビットDLLから32ビットDLLをコール」をしようと思って
調べていましたが、このご質問に頼るしか方法がなく、困っています。
状況
 VB4.0(16bit)・・・16bit版でEXEを作成
 VC++1.51・・・・・16bitDLLを作成
 VC++4.0/6.0・・・・32bitDLLを作成

 VB4.0(16bit)のEXEから、16bit版のDLLをコールし処理を行いたいの
 ですが、16bit版DLLで扱えないVC++の関数(プロセス関数:spawn??())
 を利用しなければならず、16bit版DLLの機能を32bit版DLLで作成し、
 16bit版DLLから32bit版DLLを呼び出そうと思っております。

誰か助けて! 是非、皆様のお知恵を拝借致したく思います。

Aベストアンサー

#1akinori_sです。
microsoftにサンプルがあったので参考にしてみて下さい。

参考URL:http://www.microsoft.com/japan/support/kb/articles/JP104/0/09.asp


人気Q&Aランキング

おすすめ情報