ユーザーがカスタム「関数」を実装して、ある種のインタープリターで実行できるようにするプログラムを C で作成しています。また、ユーザーがこれらのカスタム関数をプレーンな C で記述し、動的にロードできるようにしたいと考えています。これを行うために、インタープリター関数用とネイティブ関数用の 2 つの構造体を作成しました。
簡単な例を次に示します。
struct func_lang {
bool is_native;
char* identifier;
// various other properties
}
typedef void (*func_native_ptr)(int);
struct func_native {
bool is_native;
char* identifier;
func_native_ptr func_ptr;
}
次にidentifier
、各構造体のプロパティを使用してそれらをハッシュテーブルに配置します。これを使用して、実行時にそれらを実行できます。
私の問題は、実際にはロードされたライブラリの反対側にあります。ロードされたライブラリがリストに挿入したい関数を「公開」できるようにしたいと思います。たとえば、次のような関数を使用できます。
void register_func_native(char* identifer, func_native_ptr func_ptr);
次に、init
ライブラリから関数を呼び出すと、この関数を呼び出して関数をハッシュテーブルに挿入できます。
これは機能しますか?register_func_native
ロードされたライブラリで必要とされるため、関数がどのようにリンクされるかについて少し混乱していますが、ローダー自体で定義する必要があります。ローダー関数を別の共有ライブラリに実装して、実行時にリンクできるようにする必要がありますか?