• ベストアンサー

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

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

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.3

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: シンボルがありません

ari_els
質問者

お礼

先程、試しにやってみましたが、 不要な情報もかなり出てくるので、使い方を調べています。 でも、これで糸口がつかめそうです。 情報ありがとうございました。

その他の回答 (2)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

nmコマンドを使えば?

参考URL:
http://www.linux.or.jp/JM/html/GNU_binutils/man1/nm.1.html
ari_els
質問者

お礼

試しにやってみました。 かなり訳が分からない情報も混ざっていますが、糸口はつかめそうな感じです。 ありがとうございました。

  • galoon
  • ベストアンサー率28% (38/133)
回答No.1

ヘッダーファイルなどは用意されていませんでしょうか? まれに、ヘッダーファイルに記載されていない隠れ関数がありますが、たいていは記載されている範囲で満足できると思いますよ。

ari_els
質問者

お礼

情報ありがとうございます。 ヘッダファイルはどこかにあると思われますが、ファイル数が半端ではないのでちょっと探すのは困難な状況です。ライブラリと同一名のヘッダでも見つかれば良いのですが、なかなかヒットさせるのは難しいんですよね。

関連するQ&A

  • 共有ライブラリのシンボル削除

    とてもセキュリティを深く考えなければならない共有ライブラリ(.so)を作成しています。 作成したライブラリからシンボルを完全に削除したいのですが,例えば,mylib.so というライブラリ名だとすると $ strip mylib.so とすれば,nmコマンドではシンボルは表示されなくなりました。 しかし,バイナリエディタで mylib.so を開くと,エクスポートするつもりのない内部関数まで,見えてしまっています。 バイナリエディタで開かれても,関数名を見えなくする方法はありますでしょうか。 ご存知の方,ご教授ください。

  • Unix上C++でのdllとインポートライブラリの関係

    こんにちわ。 いつも教えてgooにお世話になっているorange_pieです。 UNIX上のC++で作成した自作ライブラリをdllにして配布したいのですが、 Unixでの基本的な考え方を教えてください。 (1)Unix上ではDLLの標準的な名称は”libxxxx.so”とするのが普通ですか?  ※この形式ならLD_LIBRARY_PATH環境変数が検索してくれる。。。 (2)通常、DLLにする場合、インポートライブラリ(.lib)と実際のライブラリ(.so)を作成して、使用する側はインポートライブラリのみをリンクするのでしょうか? (3)配布されたdllを使う側では、Link時にインポートライブラリをリンクして、関連インクルードファイルをインクルードするだけで使えるのでしょうか? (4)上記の(2)のように、インポートライブラリとライブラリの実態を作成する為のコンパイルオプションが見つかりません。(ldのmanを見たのですが、意味がわからないと言うか。。。。。) この質問は、自作ライブラリからlibxxx.soという形のオブジェクトファイルを作り、別プログラムからこのlibxxxをコンパイルオプション(-l)でリンクしてみたら正しく動作したのですが、これでは結局ライブラリの本体が一緒にリンクされている様子で、出来上がった実行形式のファイルサイズが静的ライブラリとしてリンクした時と同じ大きさになっていることに疑問を抱いてしまったものです。  この状態でも、ライブラリの方だけコンパイルしなおして実行すると ちゃんとライブラリの変更点は反映されるので問題は無いのですが、 これでもダイナミックリンク・ライブラリと呼べるのでしょうか?

  • 静的ライブラリ利用時の実行ファイルのサイズ

    言語はC++,コンパイル環境はVS2013のリリースモードです. 静的リンクライブラリと動的ライブラリについてはある程度は理解しております. 静的ライブラリに関する質問なのですが,そのライブラリの1部しか利用しない場合でも,利用側プログラムのバイナリにはライブラリのバイナリすべてが含まれてしまうのでしょうか. 例えば,100個の関数から構成される静的ライブラリを作ったとして,あるプログラムAはそのライブラリのうちの10個の関数しか呼び出さないとします. このとき,プログラムAのバイナリは,ライブラリの使わない関数のバイナリもすべて含んでしまうのでしょうか. 自作ライブラリを作成するにあたって,1つの静的ライブラリにプログラムを集中させるべきか否かで悩んでおります.

  • ライブラリの修正方法

    急ぎの要件を手探りで行っているので、準備不足、知識不足での質問となりますがご容赦ください。 OpenSolarisを使用していますが、OpenSolaris上で開発する際に使用するC言語の共有ライブラリを一部修正したいと考えています。(例えば、getnameinfo()が含まれるlibsocket.so) 目的の関数のソースコード修正は行ったのですが、この修正ソースを反映させて共有ライブラリを作成する方法がわかりません。 ライブラリのソースコードに同梱されているMakefileを使用すればできると思ったのですが、共有ライブラリは更新されません。(タイムスタンプから判断しました。) C言語で使用する関数を修正し、共有ライブラリに反映させるような場合は一般的にどのような方法をとるものなのでしょうか? ご存知の方がおられましたらご教示いただければありがたいです。

  • UNIXで動作するFTPクライアントライブラリ

    C言語から呼び出し可能なFTPクライアント用のライブラリを探しています。(できれば無料を望みますが有料でもかまいません)動作環境はUNIXであると聞いてますが詳細は不明です。(LINUXで動作するものでも問題ないと思っています)ご存じの方おりましたら教えていただけませんでしょうか。 質問の意図は、ファイル名、ファイル転送先などをパラメータで与え、そのファイルの内容を指定先へ送信するような共通関数をC言語で簡単に作りたいためです。FTPクライアントをsystemで呼び出して行う方法も考えましたが、それは最後の手段としたいと思っています。

  • Dreamweaverのライブラリ機能について

    ライブラリを修正してサイトの更新をした際に、全く関係のない別のライブラリのソースまで変わってしまうしまうことがあります。ライブラリファイルの中身が変わるわけではなく、適用先ファイルのソースが変わります。(オリジナルから切り離して再度導入すればもとのソースに戻ります) ライブラリを修正するたびに、その関係ないライブラリ部分を切り離し再導入しなければならないため、とても面倒です。変わってしまう部分はFlashのパスの部分なのですが、解決策はありますでしょうか?

  • Cコンパイル時にポスグレのライブラリが見つからない

    LinuxでC言語にてコンパイルをする際に(makefileを使用)にポスグレのライブラリが見つからないという下記エラーが出力されます。 しかしポスグレのライブラリはmakefileにて指定した箇所(-Lオプションにて/opt/prov/pgsql/libを指定)に存在しています。 makefileに誤りがなく、シンボリックリンクも正確に貼られていると考えると他にどのような原因が考えられるのでしょうか?(環境変数の設定等でしょうか??) エラー ------------- /usr/bin/ld: skipping incompatible /opt/prov/pgsql/lib/libpq.so when searching for -lpq /usr/bin/ld: skipping incompatible /opt/prov/pgsql/lib/libpq.a when searching for -lpq /usr/bin/ld: cannot find -lpq ボスグレのライブラリは存在している ---------- -rw-r--r-- 1 postgres postgres 126994 X月 XX 16:XX /opt/prov/pgsql/lib/libpq.a lrwxrwxrwx 1 postgres postgres 12 X月 XX 16:XX /opt/prov/pgsql/lib/libpq.so -> libpq.so.2.2 lrwxrwxrwx 1 postgres postgres 12 X月 XX 16:XX /opt/prov/pgsql/lib/libpq.so.2 -> libpq.so.2.2 -rwxr-xr-x 1 postgres postgres 90659 X月 XX 16:XX /opt/prov/pgsql/lib/libpq.so.2.2

  • 関数ライブラリ一覧

    C言語の関数一覧のようなものは何を見たらわかるのでしょうか? 標準関数の一覧はよく見かけますが、ほかの関数の一覧はないのでしょうか? たとえば、あるインターネット上で公開されていたソースコードには #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <sys/param.h> #include <sys/uio.h> #include <unistd.h> と書いてありました。 上3つは標準ライブラリにかいてありますが、その他は載ってません。 こういったsys/uio.hなどの仕様はどこで見れるのでしょうか? よろしお願いします。

  • c言語 プログラム メニュー

    C言語のプログラムでメニューの原型を作りたいと思っています。 内容としては ・標準ライブラリのみ ・関数を自作する ・関数の中身はprintfやscanfなど初歩的なもののみ ・メニューといっても1◯◯、2◯◯、3◯◯、4終了を表示(◯◯は適当)し、キーボードで1、2、3が入力されるともう一度メニューが表示されるというものです。(4のみプログラム終了) ご協力お願いします。

  • Unsatisfied code symbol エラーについて

    UNIX上でcのプログラムを作成しています。 OSはHP-UX B.11.23 U ia64 (td)です。 共有ライブラリ(~.sl)を作成したのですが、 これを実行モジュール(a.out)にリンクしてコンパイルして、a.outを実行すると、 エラーになってしまいます。 エラーの内容は、 /usr/lib/hpux64/dld.so: Unsatisfied code symbol 'xxxxx' in load module '/.../...~/a.out'. というもので、ライブラリ内にあるはずのxxxxxをa.outで使用しているのですが、 これが見つからないというエラーのように思えます。 ライブラリ内にはいくつか関数を用意していて、そのほかの関数は普通に使えています。 ライブラリを作成するときにincludeファイルを用意していますが、 その中でexternで関数の宣言をしていて、 xxxxxが他の関数と異なった設定をしているとは思えません。 このような場合、エラーの原因としてどのようなことが考えられるでしょうか? ほとほと困っています…。 どなたか解決方法をご教授願います。 またライブラリに含まれる関数を表示させるUNIXコマンドってありましたでしょうか? もしご存知でしたらあわせて教えていただけると助かります。 何か必要な情報で書き足りないものがありましたら、補足いたしますのでご指摘ください。 よろしくお願いいたします。

専門家に質問してみよう