このアプリケーションノートを確認してください。ダイナミックリンクがどのように機能するか、そして独自のダイナミックローダーを作成するために何をする必要があるかを詳細に説明しています。また、それに代わるものもいくつかあります。ジャンプテーブルの実装は非常に簡単で、APIアドレスの変更に関する問題を解決できると思います。
編集:簡単なジャンプテーブルを作成する方法は次のとおりです。まず、メインプログラムからエクスポートする必要のある関数を決定します。次に、関数ポインタの構造を作成します。
typedef struct _MyAPI
{
int (*init)(int flags);
int (*exit)(int exitcode);
void * (*getmem)(size_t size);
void (*freemem)(void *ptr);
} MyAPI;
メインプログラムで、この構造のインスタンスを定義し、ポインターを入力して、事前定義されたアドレスに配置します。
#include <jumptbl.h>
int main_init(int flags)
{
return 0;
}
//...
MyAPI main_API __attribute__((section(".jumptbl"))) =
{
&main_init,
&main_exit,
&main_getmem,
&main_freemem,
};
(このアプローチを使用する場合は、リンカーファイルに.jumptblセクションを記述し、固定アドレスを取得するようにする必要があります)
ロードされたモジュールで、ジャンプテーブルへのポインタを取得し、それを使用してメインプログラムを呼び出します。
#include <jumptbl.h>
MyAPI *pAPI = (MyAPI*)(0x1000000); // there should be a better way to do this
int main()
{
pAPI->init(0);
void *block = pAPI->getmem(0x30);
//...
}
お役に立てれば!