忙しい現代人の腰&肩のお悩み対策!

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

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

A 回答 (3件)

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
    • good
    • 1
この回答へのお礼

ありがとうございます!助かりました。

お礼日時:2015/10/26 01:45

「ライブラリが32bitか64bitのどちらでコンパイルされたのかが知りたい」が


・ライブラリが 32bit 環境の上でコンパイルされたのか 64bit 環境の上でコンパイルされたのか
・ライブラリが 32bit 環境向けにコンパイルされたのか 64bit 環境向けにコンパイルされたのか
のどちらを意図しているのか読み取りにくいのですが, 後者であれば file でわかるはずです. 前者はそもそも意味のない情報だしバイナリには残らないかもしれない.

あと, コンパイラのバージョンもバイナリには残らない可能性があります. とりあえずチャレンジとしては string で調べてみる, かなぁ.

あ, どちらも使い方はマニュアルで調べてください.
    • good
    • 0
この回答へのお礼

ありがとうございます!参考になりました。

お礼日時:2015/10/26 01:45

どのような目的で「ライブラリをコンパイルした環境」を確認したいのでしょうか?



「32bit,64bitが混在しており、どれを使えば良いのかわからない状況です」という文章からすると「32bit 環境でコンパイルされたのか 64bit 環境でコンパイルされたのかを知りたい」ということでしょうか? でも, それを知ったとしても「どれを使えば良いのか」には直結しませんよ.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
どのライブラリを使うかはわかっているのですが、そのライブラリが32bitか64bitのどちらでコンパイルされたのかが知りたいということです。
またコンパイラのverなどもわかるとありがたいです。
もし、やり方をご存知でしたら教えていただけますでしょうか?

お礼日時:2015/08/21 17:24

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

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

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

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

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

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

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

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

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

Q64bit対応

32bitマシンで使っていたソースを、64bit化する際に
気をつけたこと、困った経験などがありましたら、教えて下さい。

どういったことが問題になるのか、勘所がわからないので、
勉強の為に質問させていただきました。
具体例なんかあると嬉しいです。
よろしくお願いします。

Aベストアンサー

#3です。
>tatsu99さんは、64bit対応の際に、まずそれぞれの型のバイト長を
>調べて、2.long型を使用しないとされたんでしょうか。
その通りです。プログラマたるもの、そのぐらいは常識です。
マニュアルで調べ、かつ全ての型を、
printf("charのサイズ=%d",sizeof(char));
printf("char*のサイズ=%d",sizeof(char*));
printf("intのサイズ=%d",sizeof(int));
のようにして調べて下さい。
その結果、long型が32ビットと64ビットで異なるため通常は使用しないようにしました。

>私はintを使わないようにと言われたことがあります。
>なぜなのかよくわかってないので、
int型は、かつての古きよき時代(MS-DOSの時代)には2バイトでした。そのため、int型は、OSによりサイズが異なると思っている人が多いです。そのために、上記のことをいわれたのかと思います。この認識は、正しい場合もあり、そうでない場合もあります。(HP-UX,solarisでは正しくありません)
どのOS(又はコンパイラ)で、64ビットにするかは、わかりませんが、それが、明確になったとき、全ての型のサイズを自分で調べることが、大切です。

#3です。
>tatsu99さんは、64bit対応の際に、まずそれぞれの型のバイト長を
>調べて、2.long型を使用しないとされたんでしょうか。
その通りです。プログラマたるもの、そのぐらいは常識です。
マニュアルで調べ、かつ全ての型を、
printf("charのサイズ=%d",sizeof(char));
printf("char*のサイズ=%d",sizeof(char*));
printf("intのサイズ=%d",sizeof(int));
のようにして調べて下さい。
その結果、long型が32ビットと64ビットで異なるため通常は使用しないようにしました。

>私はintを使わ...続きを読む

Qセマフォとmutexの違いは?

排他制御としてセマフォとmutexがありますが、
この二つの違いがよくわかりません。
自分で調べてみたところ、
・セマフォ…プロセス間排他制御。複数ロックがかけられる。
・mutex…スレッド間排他制御。ロックは一つだけ。

と言うような違いがあるようなのですが、これだけの差なんでしょうか?
(これだけの差、と言ってる時点で筋違いだったら申し訳ありません)
また、セマフォをスレッド間排他制御に用いたり、
mutexをプロセス間排他制御に用いることは可能なのでしょうか?
可能だとしたら、これらが2種類存在する理由も教えていただきたいです。

Aベストアンサー

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。)

ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。

ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphore...続きを読む

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ビット用のバイナリが生成できるかどうか確認した方がいいと思う.

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です。

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

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

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

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

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

Aベストアンサー

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

QC言語で構造体のメンバを簡単に出力する方法ありますか?

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを簡単に取り出せるのでしょうが(間違っているかもしれません・・・)、C言語で構造体のメンバを、for文などのループを使って簡単に出力できる方法はないでしょうか?

メンバの型は、一定ではなく、char、int、double、別の構造体のポインタ型(これは出力しなくて良い)と混在しています。メンバが全て同一の型ならポインタで構造体の先頭アドレスからsizeof(メンバの型)の分インクリメントしていけば出力できそうな気もしますが、メモリ上に連続して確保されるのかも私にはわからないので困っています。

enumで列挙して・・・というのも調べてみましたが、応用は出来ないようでした。

どなたか、地道にメンバ名を書いて出力する以外の方法をご存知の方、いらっしゃいましたらお知恵をお貸しください。
よろしくお願いいたします。
※説明不足の点がありましたら補足いたします。

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを...続きを読む

Aベストアンサー

コードを書かないという方向性の提案を一つ。
デバッガに構造体の内容を出力させるというのはどうでしょうか。

struct {
int a;
char *b;
double c;
}
という型を持つ変数xがあったとして、gdbでは下記のような出力が得られます。
(gdb) print x
$1 = {
a = 123,
b = 0x2fd0 "ABC",
c = -9876.5
}


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

人気Q&Aランキング