プロが教えるわが家の防犯対策術!

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

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をインストールしています。

よろしくお願いします。

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

A 回答 (5件)

>どちらも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をインストールすればよいのでは?

この回答への補足

yum install libgcc.x86_64 libgcc.i686
でいけました。

補足日時:2014/05/21 09:04
    • good
    • 1

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



9ぢゃねぇぇぇぇぇ…
i386ね。
    • good
    • 2
この回答へのお礼

大丈夫ですよ。ありがとうございます。

お礼日時:2014/05/21 09:05

>インストールしようとすると、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.i686を入れられない」というエラーメッセージが出力されたんですか?
エラーメッセージを書く際には趣旨など意訳したものではなく出力されたそのままを書きましょう。
意訳が不適切だった場合、伝言ゲームになってしまいます。

で、x86_64版とi686版を共にインストールする際にはバージョンが同一である必要があるので

libgcc-4.4.7-3.el6.x86_64
libgcc-4.4.7-4.el6.i686

は一緒にはインストールできません。
libgcc-4.4.7-3.el.i686をどこからか調達してくるかgcc関連をごっそり4.4.7-4にしてください。
    • good
    • 2
この回答へのお礼

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

お礼日時:2014/05/21 09:06

 過去の記録によると。



>64ビットのlinuxで32ビットメモリモデルの指定のしかたを御教えください
http://oshiete.goo.ne.jp/qa/2324332.html

 この質問は解決をしたらしい。

参考URL:http://oshiete.goo.ne.jp/qa/2324332.html

この回答への補足

ご紹介いただいたURLに記載されていた以下を実施しようとしたのですが、どちらもNo package libgcc.i386 available でエラーになりました。

yum install glibc-devel.i386
yum install libgcc.i386

補足日時:2014/05/20 15:35
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/05/20 15:35

libgcc.i686 はインストールしてありますか?

この回答への補足

インストールしようとすると、libgcc-4.4.7-3.el6.x86_64がすでに入っているので、 libgcc-4.4.7-4.el6.i686を入れられない、という趣旨のメッセージが出ます。

補足日時:2014/05/20 09:01
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2014/05/20 09:01

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

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

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

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

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

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

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

Aベストアンサー

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

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

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

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

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

Aベストアンサー

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

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...続きを読む

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 となって...続きを読む

Qmakeコマンドができない

基本的なことだと思いますがお願いします。

fedore core で色んなことをやってみようと思い sl を インストール

していたのですがmakeができないのです。インストール通りにできないの

はなんでですか? makeコマンドは /usr/bin にありました。

的はずれなこと言っていたらすみません。

[root@localhost sl]# ls -lrt
合計 36
-rw-r--r-- 1 3605 lock 4101 1月 19 1994 sl.h
-rw-r--r-- 1 3605 lock 980 1月 19 1994 sl.txt
-rw-r--r-- 1 3605 lock 689 1月 19 1994 sl.1
-rw-r--r-- 1 3605 36 417 7月 22 1998 README
-rw-r--r-- 1 3605 36 331 7月 22 1998 Makefile
-rw-r--r-- 1 root root 76 10月 31 2005 install.txt
-rw-r--r-- 1 3605 36 7131 10月 31 2005 sl.c
[root@localhost sl]# more install.txt
1. # tar xvf sl.tar
2. # cd sl
3. # make
4. # cp sl /usr/local/bin/
5. # sl
[root@localhost sl]# make
cc -O -o sl sl.c -lcurses -ltermcap
make: cc: コマンドが見つかりませんでした
make: *** [sl] エラー 127

基本的なことだと思いますがお願いします。

fedore core で色んなことをやってみようと思い sl を インストール

していたのですがmakeができないのです。インストール通りにできないの

はなんでですか? makeコマンドは /usr/bin にありました。

的はずれなこと言っていたらすみません。

[root@localhost sl]# ls -lrt
合計 36
-rw-r--r-- 1 3605 lock 4101 1月 19 1994 sl.h
-rw-r--r-- 1 3605 lock 980 1月 19 1994 sl.txt
-rw-r--r-- 1 3605 lock 689 1月 19 1994 sl.1
-rw-r--...続きを読む

Aベストアンサー

そのslの出自がわかりませんが、
http://www.tkl.iis.u-tokyo.ac.jp/~toyoda/
にあるものならば、

Makefile の
CC=cc
という行を
CC=gcc
に変更して再度 make してみてください。

> make: cc: コマンドが見つかりませんでした

というメッセージが出ているのだから、makeそのものは実行できている
というのはわかりそうなものですが。make 一発ですまないのは
このslだいぶ前に作られた古いものだからでしょうね。

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が設定されている場合はこちらが使用されます。

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

QGCCでライブラリが足りない

はじめまして。

LindowsOS4.0を使っています。
コンパイルができずに困っています。

GCCとMAKEをインストールしました(Lindowsはどちらも入っていないのです。Debian/Woodyベースと言われています)。

gcc 2.95.4
make 3.79.1

which gcc
とすると、/usr/bin/gcc
と表示されます。

で、./configure
すると、

.....
checking whether the C compiler works ... no

と表示されコンパイルエラーになります。

configure.log
を見ると、

-------------------
checking for gcc
configure:916: checking whether the C compiler (gcc ) works
configure:932: gcc -o conftest conftest.c 1>&5
/usr/bin/ld: cannot open crt1.o: No such file or directory
collect2: ld returned 1 exit status
configure: failed program was:

#line 927 "configure"
#include "confdefs.h"

main(){return(0);}
---------------------

とか

---------------------
checking for gcc
configure:905: checking whether the C compiler (gcc ) works
configure:921: gcc -o conftest conftest.c 1>&5
/usr/bin/ld: cannot open crt1.o: No such file or directory
collect2: ld returned 1 exit status
configure: failed program was:

#line 916 "configure"
#include "confdefs.h"

main(){return(0);}
----------------------

とかなっています。

confdefs.hというのは何かのライブラリなのでしょうか?これが無いとconfigureできないのでしょうか??

よろしくお願いいたします。

はじめまして。

LindowsOS4.0を使っています。
コンパイルができずに困っています。

GCCとMAKEをインストールしました(Lindowsはどちらも入っていないのです。Debian/Woodyベースと言われています)。

gcc 2.95.4
make 3.79.1

which gcc
とすると、/usr/bin/gcc
と表示されます。

で、./configure
すると、

.....
checking whether the C compiler works ... no

と表示されコンパイルエラーになります。

configure.log
を見ると、

-------------------
...続きを読む

Aベストアンサー

Lindowsは未経験なのでアドバイスですが、


>で、./configure
>すると、
>.....
>checking whether the C compiler works ... no
>と表示されコンパイルエラーになります。

./configure はコンパイルをしているのではありません。
また、この一行だけ書かれても、エラーかどうか回答者にはわかりません。


>/usr/bin/ld: cannot open crt1.o: No such file or directory

crt1.oが見つからない様ですが、
redhatの場合crt1.oは、/usr/lib/配下にあります。
redhatの場合crt1.oが含まれるパッケージ名は「glibc-devel-X.X.X」
に含まれています。

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

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

教えて下さい。

Aベストアンサー

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

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

Qi386 と i686 の違いとパッケージについて

Red Hat Linux 9を使用しております。
表記の通り、rpmパッケージにはi386やi686という
数字の表記された物が配布されていますが、
普段は(というより、デフォルトでは)i386を使っているのですが、
i686のものとはどう違うのでしょうか?

また以下のサイトで配布してあるapacheを
デフォルトインストール状態のapacheに(おそらくi386)
rpm -Uhv でアップデートしても大丈夫でしょうか?
入れる場合は一度アンインストールした方がいいのでしょうか?
アドバイス宜しくお願いします。

http://rpm.fumika.jp/apache

Aベストアンサー

i368はintel i386以降のCPUで動作するバージョンです。
i686はintel Pentium PRO以降のCPUで動作するバージョンです。

動作は一緒(基本的にソースも一緒。コンパイラオプションが違うだけ)ですが、Pentium PRO以降のCPUを使っている場合、i686の方が高速に動作する(はず)。

rpm -Uはi386がi686になっても問題ないと思いますが、配布元が異なっている場合、rpm -Uは問題になるかもしれません。


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

人気Q&Aランキング