2

動的にリンクされた共有ライブラリを拡張することに加えて? クローズド ソースの共有ライブラリのすべてのパブリック メソッドのリストを取得する方法を知りたいです。

私が試してみました

nm -D libfoo.so
readelf -s libfoo.so

しかし、戻り値の型、引数などの情報がありません。

この分野の初心者として、これらのメソッドのどれが自分のアプリケーションで呼び出せるかさえわかりません。

もっと便利なツールはありますか?

編集:

非常に単純な例として、次のものがあります。

libtest1.c:

int puts(char const *);

void libtest1()
{
    puts("libtest1: called puts()");
}

次に、libtest1.c を libtest1.so にコンパイルしました。

gcc -fPIC -shared -o libtest1.so libtest1.c

私の「プログラム」(test.c)では、共有ライブラリを次のように使用します。

void libtest1();  //from libtest1.so

int main()
{
    libtest1();
}

test.c をコンパイルしてテストします。

gcc -o test test.c -ltest1 -ldl

含める libtest1.h はありませんが、これは機能します。呼び出す libtest1() メソッドがある可能性があることを知っているため、「ちょうど」機能します。

libtest1.c をなくして、libtest1.so を手にしただけで、メソッドに何があり、どのパラメーターが必要かを覚えていないことを考えてみてください。

それはばかげた例です、私は知っています:)

または、他の例として(おそらくより良い):

システムのどこかに「libstone2goldconverter.so」を見つけたと仮定して、「なんてこった、私はそれを使うだろう」..しかしどうやって?

4

2 に答える 2

2

C ライブラリから必要な情報を見つける方法はありません。情報はコンパイラによって破棄されます。(C++ ではある程度できますが、C ではできません。)

ごめん!

(Veger の言うとおり、ライブラリと共にヘッダー ファイルを提供する必要がありました。これは、この情報を伝えるためのものです。)

于 2013-01-23T14:49:27.677 に答える
2

共有ライブラリは通常 (常にではないにしても)、パブリック API を含むヘッダー ファイルを提供します。

そのため、ライブラリから (パブリック) 関数を直接取得しようとする代わりに、これらのヘッダー ファイルを見つけようとする必要があります。

  • アプリケーションのコンパイルに必要です
  • ドキュメントが含まれている可能性があります
  • 開発者が意図したパブリック API を含む

編集
あなたの例では、定義します

void libtest1();

これは通常、ライブラリに属する​​ヘッダー ファイルに入れます。そして、使用する必要がある定義の代わりに:

#include "libtest1/public_api.h"

(または、ライブラリ/ヘッダー名に応じて、同様のもの)

ヘッダーを「失う」と、パブリック API を知らなくなり、推測する必要があるため、ライブラリは「無価値」になります (これは明らかに望ましくありません)。

ヘッダー ファイルを使用せずに「そのまま」が機能する理由は、関数の定義を実際に知っているからです。コンパイラは定義を信頼し (推測したかどうかわからないため)、それを受け入れます。オブジェクト ファイルを実行可能ファイルにリンクしようとすると、リンカーはライブラリ内の未定義関数へのすべての参照を見つけようとします。この段階で、リンカーは関数が実際に存在するかどうか (正しいパラメーターと戻り値の型を使用して) を確認します。存在しない場合は、エラーが生成されます。

その場合、付随するヘッダー ファイルを見つけるのは非常libstone2goldconverter.soに困難です(システム上、サポート Web サイト上、作成者に電子メールで送信するなど)。ヘッダーファイルなしでライブラリを(適切に)使用する方法はないためです。

これはあなた (開発者) だけでなく、ライブラリの所有者にも当てはまります。したがって、ヘッダー ファイルがどこかに存在することは確実です。唯一のことは、あなたのlibstone2goldconverter.soライブラリはプロプライエタリに見え、ライブラリの作成者/会社はマーケティング上の立場を著しく損なうため、ヘッダーファイルを提供する可能性は低いです... ;)

于 2013-01-23T14:50:13.120 に答える