2008-09-15 14 views
1

C共有ライブラリから任意の関数を呼び出すための小さなユーティリティを書きたいと思っています。 objdumpやnmと同様に、エクスポートされた関数をすべてリストすることができます。私はこれらのユーティリティのソースを確認しましたが、彼らは威圧しています。 dlライブラリにこの機能がある場合は、Googleで十分な情報を見つけることができませんでした。クロスプラットフォームの方法でcバイナリの関数名を検索する最も簡単な方法は何ですか?

(明確化編集:私は事前に知られている関数を呼び出すにしたくない、私はあなたの答えに沿っ例フラグメントを感謝します。)

答えて

2

これは、あなたが探しているものに近いかもしれません。 http://python.net/crew/theller/ctypes/

+0

ctypesでは、事前に引数の数とタイプを知る必要があります。これは、OPによる「明確化編集」に反する。 参照: http://python.net/crew/theller/ctypes/tutorial.html#specifying-the-required-argument-types-function-prototypes – Kevin

2

さて、私はWindowsについて少し話します。 DLLからエクスポートされたC関数には、引数の型、名前、または数に関する情報は含まれていません。また、関数の呼び出し規約が何であるかを判断することもできません。

比較のため、National InstrumentsのLabVIEWプログラミング環境をご覧ください。 DLLから関数をインポートすることはできますが、特定の関数を使用する前に、引数の型と名前を手動で入力する必要があります。この制限が問題ない場合は、質問を編集してそれを反映させてください。

* nix環境で可能なことはわかりません。

EDIT:あなたの明確化について。関数が何を前もって知っていない場合は、関数が取る引数の数と型が何であるかを一般的に判断することができないため、Windowsにはかなり戸惑っています。

+0

私はstdcallを作成する必要はありませんので、コールスタックについて心配する必要はありません。 私が覚えている限り、dllファイルには、残った名前のようなエクスポートされた関数に関する情報がいくつか残っています。 – artificialidiot

+0

マンングル化された名前は保持され、C++ライブラリの引数情報を伝えることができます(名前をアンマネージする方法が分かっていると仮定します)。しかし、OPは "C"を指定しました。 MSVCは、呼び出し規約と引数の合計サイズをバイト単位で管理するためにCの名前を変更することがありますが、依然として重要な情報はありません。 – Kevin

1

ParaDynのSymtabAPIを試すことができます。共有ライブラリ(または実行可能ファイル)内のすべてのシンボルを取得し、型やオフセットなどを調べることができます。それはすべて、合理的に優れたC++インターフェイスでラップされ、多くのプラットフォームで実行されます。また、実行時にあなたが話していることを実行するために潜在的に使用できるバイナリの書き換えをサポートしています。

ウェブページはこちらです:

http://www.paradyn.org/html/symtab2.1-features.html

ドキュメントはこちらです:

http://ftp.cs.wisc.edu/paradyn/releases/release5.2/doc/symtabProgGuide.21.pdf

1

標準っぽいAPIのdlopen/dlsymをAPIがあります。 AFAIKは、LinuxおよびMac OS Xの標準Cライブラリ(libSystem)でGNU libcによって実装されており、MinGWまたは他の互換パッケージによってWindows上に実装される可能性があります。

+0

誰でもこのAPIを使用した例を提供できますか? – artificialidiot

+0

新しいStackOverflowの質問をするか、グーグルだけにお試しください。 dlopen()はWindowsでは使用できませんが、LoadLibrary()は同様の機能を提供します。 –

0

nmとobjdumpのソースコードがあります。あなたが仕様から始めるなら、ELFはあなたが調べたいものです。

/アラン

-1

Eek!プラットフォームに依存するプログラミングのトピックの1つに触れました。ウィンドウズでは、DLLを持っています.Linuxでは、ld.sold-linux.so、そしてmac os xのdyldです。

+0

ご迷惑をおかけして申し訳ございません。 – artificialidiot

0

私はPerlでこれを書いています。 Win32ではdumpbin/exportsを実行し、POSIXではnm -gPを実行します。そして、それはPerlなので、結果は正規表現を使って解釈されます:POSIXでは、Win32(stdcall関数)では/ _(\ S +)@ \ d +//(S)とT/

1

実用的な解決策(車輪を再発明しない)はlibbfdを使用するようです。不利な点は、ドキュメントが不十分で、私の目的のために少し膨らんだことです。

関連する問題