Vxworks 5.5 スタイルのカーネル モジュールとして最初に実装された既存のプロジェクトがあります。
このプロジェクトは、外部コードを実行する「ホスト」として機能する多くのタスクを作成します。次のようにします。
void loadAndRun(char* file, char* function)
{
//load the module
int fd = open (file, O_RDONLY,0644);
loadModule(fdx, LOAD_ALL_SYMBOLS);
SYM_TYPE type;
FUNCPTR func;
symFindByName(sysSymTbl, &function , (char**) &func, &type);
while (true)
{
func();
}
}
これはすべて夢のように機能しますが、呼び出される関数は再入可能ではなく、グローバルデータがいたるところにあるなどです。これらの外部モジュールの複数のインスタンスを実行できるようにするという新しい要件があります。私の明らかな最初の考えはvxworks RTP を使用してメモリを分離します。
しかし、何を試しても、新しい RTP プロジェクトをコンパイルしてリンクするよう説得することはできません。
error: 'sysSymTbl' undeclared (first use in this function)
正しいインクルードを追加すると:
#include <sysSymTbl.h>
私は得る:
error: sysSymTbl.h: No such file or directory
そして、externを定義するだけの場合:
extern SYMTAB_ID sysSymTbl;
私は得る:
error: undefined reference to `sysSymTbl'
実際のモジュール ロード コードをステッチしようとしても開始していません。現時点では、シンボル ルックアップを機能させたいだけです。
では、VxWorks RTP アプリケーションからシステム シンボル テーブルにアクセスできますか? moduleLoad は使用できますか?
EDIT 私がやろうとしていることは、プラグインのセクション(V6.8のセクション4.9)(@nosに感謝)のアプリケーションプログラマーガイドでカバーされているようです。これは、dlopen()などを使用することです。このように:
void * hdl= dlopen("pathname",RTLD_NOW);
FUNCPTR func = dlsym(hdl,"FunctionName");
func();
ただし、コンパイラに -Xbind-lazy -non-static を指定しても、リンカー地獄に陥ります。
undefined reference to `_rtld_dlopen'
undefined reference to `_rtld_dlsym'