C 共有ライブラリから任意の関数を呼び出す小さなユーティリティを作成したいと考えています。ユーザーは、objdump や nm と同様に、エクスポートされたすべての関数を一覧表示できるはずです。これらのユーティリティのソースを確認しましたが、威圧的です。dl ライブラリにもこの機能がある場合、Google で十分な情報を見つけることができませんでした。
(明確化の編集:事前にわかっている関数を呼び出すだけではいけません。回答に沿ったフラグメントの例をいただければ幸いです。)
さて、私はWindowsについて少し話します。DLLからエクスポートされたC関数には、引数の型、名前、または数に関する情報は含まれていません。また、特定の関数の呼び出し規約を判別できるとは思いません。
比較のために、NationalInstrumentのLabVIEWプログラミング環境を見てください。DLLから関数をインポートできますが、特定の関数を使用する前に、引数のタイプと名前を手動で入力する必要があります。この制限に問題がない場合は、それを反映するように質問を編集してください。
*nix環境で何ができるのかわかりません。
編集:あなたの説明について。関数が何であるかを事前に知らない場合は、一般に関数が取る引数の数とタイプを判別できないため、Windowsにかなり困惑しています。
これはあなたが探しているものに近いかもしれません: http://python.net/crew/theller/ctypes/
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
libbfd を使用するのは、賢明な解決策 (車輪の再発明なし) だけのようです。欠点は、そのドキュメントが不足していることと、私の目的には少し肥大化していることです.
標準的な API は dlopen/dlsym API です。私の知る限り、LinuxおよびMac OS Xの標準Cライブラリ(libSystem)のGNU libcによって実装されており、MinGWまたはその他の互換パッケージによってWindowsに実装される可能性があります。
nm と objdump のソース コードが利用可能です。仕様から始めたい場合は、ELF を調べてください。
/アラン
私はPerlでこのようなものを書きました。Win32 では dumpbin /exports を実行し、POSIX では nm -gP を実行します。次に、Perl であるため、結果は正規表現を使用して解釈されます: Win32 (stdcall 関数) の場合は / _(\S+)@\d+/、POSIX の場合は /^(\S+) T/ です。
えっ!プラットフォームに依存するプログラミングのトピックの1つに触れました。WindowsではDLLがあり、Linuxでは、、、およびmacosxがld.so
ありld-linux.so
ますdyld
。