0

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'
4

1 に答える 1

0

ここでの問題は、コンパイラオプションとして -Xbind-lazy と -non-static を指定するようにドキュメントに記載されていることです。ただし、これらは実際にはリンカーオプションに追加する必要があります。

次に、ランタイム リンク要件を満たすために、適切なビルド ターゲットの libc.so.1 がターゲットで必要になります。

于 2015-01-29T11:55:39.223 に答える