アレルギー対策、自宅でできる効果的な方法とは?

大量のメモリを必要とする処理のため、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と関連する良く見られている質問

Q32bitでコンパイルするには

お世話になっております。

CentOSの64ビットマシンを使っています。

C言語の簡単なサンプルとして、ポインタ変数の長さを表示するプログラム(sizeof(ポンタ変数)をprintf)を作りました。

これをコンパイルして実行すると8と表示されますので、64bitとアプリケーションとしてコンパイルされたのだろうと思います。


次に32Bitアプリケーションとしてコンパイルするために-m32オプションを付けてコンパイルしたところ、以下のとおりエラーが出てしまい困っております。


gcc -m32 -o sample sample.c
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status


解決方法について教えていただければ幸いです。


コンパイラは、gcc-4.4.7-3.el6.x86_64をインストールしています。

よろしくお願いします。

お世話になっております。

CentOSの64ビットマシンを使っています。

C言語の簡単なサンプルとして、ポインタ変数の長さを表示するプログラム(sizeof(ポンタ変数)をprintf)を作りました。

これをコンパイルして実行すると8と表示されますので、64bitとアプリケーションとしてコンパイルされたのだろうと思います。


次に32Bitアプリケーションとしてコンパイルするために-m32オプションを付けてコンパイルしたところ、以下のとおりエラーが出てしまい困っております。


gcc -m32 -o sample sample.c
/usr/b...続きを読む

Aベストアンサー

>どちらもNo package libgcc.i386 available でエラーになりました。

[root@localhost ~]# yum search libgcc
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
================ N/S Matched: libgcc ================
libgcc.i686 : GCC version 4.4 shared support library
libgcc.x86_64 : GCC version 4.4 shared support library

Name and summary matches only, use "search all" for everything.
[root@localhost ~]#

そりゃ、i396はありませんからね。


>libgcc-4.4.7-3.el6.x86_64がすでに入っているので、 libgcc-4.4.7-4.el6.i686を入れられない

libgcc-4.4.7-3.el6.x86_64をアップデートしてlibgcc-4.4.7-4.el6.x86_64ににしてから
libgcc-4.4.7-4.el6.i686をインストールすればよいのでは?

>どちらもNo package libgcc.i386 available でエラーになりました。

[root@localhost ~]# yum search libgcc
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
================ N/S Matched: libgcc ================
libgcc.i686 : GCC version 4.4 shared support library
libgcc.x86_64 : GCC version 4.4 shared support library

Name...続きを読む

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。

Q共有ライブラリの内容確認について

Linuxでプログラミングをしております。
/usr/loca/libの静的、動的ライブラリを使用したいと思っているのですが、32bit,64bitが混在しており、どれを使えば良いのかわからない状況です。
ライブラリをコンパイルした環境(コンパイラなど)を確認する方法はありますでしょうか?
ご存知の方おられましたらご教授よろしくお願いします。

Aベストアンサー

objdump コマンドを使えば、32bit と 64bit の判別は可能です。

$ objdump -a /usr/lib/libpng.so.3

/usr/lib/libpng.so.3: file format elf32-i386
/usr/lib/libpng.so.3

$ objdump -a /usr/lib64/libpng.so.3

/usr/lib64/libpng.so.3: file format elf64-x86-64
/usr/lib64/libpng.so.3


readelf コマンドでも判別できます。

$ readelf -h /usr/lib/libpng.so.3

ELF Header:
Class: ELF32
Machine: Intel 80386

$ readelf -h /usr/lib64/libpng.so.3

ELF Header:
Class: ELF64
Machine: Advanced Micro Devices X86-64

objdump コマンドを使えば、32bit と 64bit の判別は可能です。

$ objdump -a /usr/lib/libpng.so.3

/usr/lib/libpng.so.3: file format elf32-i386
/usr/lib/libpng.so.3

$ objdump -a /usr/lib64/libpng.so.3

/usr/lib64/libpng.so.3: file format elf64-x86-64
/usr/lib64/libpng.so.3


readelf コマンドでも判別できます。

$ readelf -h /usr/lib/libpng.so.3

ELF Header:
Class: ELF32
Machine: Intel 80386

$ readelf -h /usr/l...続きを読む

Q64bit環境で32bitでコンパイルするオプションはあるのでしょうか?

WindowsXP x64の環境でVC++2005でコンパイルすると64bitを生成しますが、リンクするモジュールが32bitなので、エラーになります。

fatal error LNK1112: モジュールのコンピュータの種類 ‘X86′ は対象コンピュータの種類 ‘x64′ と競合しています。

強制的に32bitでコンパイルするオプションはあるのでしょうか?

Aベストアンサー

[ビルド]メニューの下に、構成マネージャというのがないでしょうか。
そこを'x86'に設定すれば、32bitでビルドされるのではないかと。

QLinux上で、C言語で作ったプログラムを実行させる方法

VineLinux2.1のvi:スクリーンエディタを利用して簡単なプログラムを実行させたいのですが、コンパイルしたファイルを実行すると
a.out : command not found
というエラーがでてきます。
実行のさせ方がおかしいのでしょうか?

今回作ったプログラムです。
#include <stdio.h>
int main(){
printf("Hello World!");
return 0;
}

Aベストアンサー

Segmentation fault
が表示されたということは実行できたということですね。
# …でも、真っ当なプログラムになってないみたいですが。

Path (←プログラムを探すディレクトリ…というと語弊があるかな?)
に Current Directory (現在のディレクトリ)が含まれていないので、
Current Directory のファイルを実行する場合には、
「./」をファイル名の前に書いてやるなどの必要があるのです。
このあたりは DOS とは違います。

QLD_LIBRARY_PATHって?

環境変数で「LD_LIBRARY_PATH」というのがあるかと思うのですが、この変数はOSが使用する変数なのでしょうか?それとも単一、あるいは複数のアプリケーションソフト(ORACLEなどのような)が使用する変数なのでしょうか?
基本的な質問で申し訳ありませんが、教えてください。

Aベストアンサー

OSが使用する変数です。リンク時または実行時にリンクする共有ライブラリを探すために使用されます。

LD_LIBRARY_PATHが設定されていない場合、ダイナミックローダーは/libや/usr/lib等に存在するライブラリを検索しますが、それ以外の場所に存在するライブラリを見つける事ができません。

実行プログラムが32ビットの場合はLD_LIBRARY_PATHが、64ビットの場合でLD_LIBRARY_PATH_64が設定されている場合はこちらが使用されます。

なお、リンク時パスや実行時パスはコンパイル時に設定することもできます。

QUNIX上のプログラムで使うライブラリの中身を知る方法

過去にUNIX上で動作するプログラムを作成していて、その中で多数の.aや.so(標準では無く、オリジナルのもの。)を使っているのですが、.aや.so内にどのような関数があるのか、もしくはそのライブラリに関係するソース名は何か知る手段ってありませんか?
かなり前のものなので、関数仕様書もmakefileも無いため、何をライブラリとしているのか分からず困っています。
駄目もとで、バイナリエディタで中身を確認してみたのですが、何処の情報がそれを示しているかいまいち分かりませんでした。

Aベストアンサー

No.2 の方がご回答されているように、nm コマンドを使えばシンボルの一覧を表示できます。

(ex.1)
$ nm /usr/local/lib/libssl.so
U ASN1_INTEGER_get
U ASN1_INTEGER_set
U ASN1_check_infinite_end
U ASN1_dup
U ASN1_get_object
U ASN1_object_size
U ASN1_put_object
U BIO_callback_ctrl
U BIO_copy_next_retry
U BIO_ctrl
U BIO_f_buffer
00027db0 T BIO_f_ssl

ただし、U となっているものはライブラリ内で未定義のシンボル (変数や関数) であり、他のライブラリによって解決されなければならないものだったと思います。

また、ライブラリが strip コマンドによって strip されてしまっている場合はシンボルテーブルが削除されてしまうため確認できません。

(ex.2)
$ nm /usr/lib/libstdc++.so.5
nm: /usr/lib/libstdc++.so.5: シンボルがありません

No.2 の方がご回答されているように、nm コマンドを使えばシンボルの一覧を表示できます。

(ex.1)
$ nm /usr/local/lib/libssl.so
U ASN1_INTEGER_get
U ASN1_INTEGER_set
U ASN1_check_infinite_end
U ASN1_dup
U ASN1_get_object
U ASN1_object_size
U ASN1_put_object
U BIO_callback_ctrl
U BIO_copy_next_retry
U BIO_ctrl
U BIO_f_buffer
00027db0 T BIO_f_ssl

ただし、U となって...続きを読む

Qapt-get install ****** でinstallしたものをuninstallするには?

御世話になります。
vncserverだけをinstallするつもりが
誤って
apt-get install vncとうってしまいました。
これをuninstallしたいのですが
どのようにすればよろしいでしょうか?

教えて下さい。

Aベストアンサー

# apt-get remove パッケージ名
では、設定ファイルは削除されずに残ります。

完全に削除するときは、
# apt-get --purge remove パッケージ名
です。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報