11

私はarm9プロセッサに基づくプロジェクトに取り組んでいます。オペレーティングシステムなしでベアメタルのみを使用しているため、残念ながら、共有ライブラリ/ダイナミックローダーはまだサポートされていません。

メインアプリケーションから関数を呼び出すこともできるSDカードなどからライブラリをロードできるようにしたいと思います。

私の最初の試みはリンカーオーバーレイ機能(特定の絶対位置のセクションにライブラリを配置する)を使用することでしたが、前述のようにメインアプリ関数を呼び出す際の問題があります->メインアプリケーションを変更するたびに、ライブラリを再コンパイルする必要がありますコールバックできるようにします。

これによると、私は自分のダイナミックローダーを作成する必要があると思いますが、私はこの分野の初心者です。誰かが私にそれをどのように扱うか、またはそのようなプロジェクトを始める方法の例を教えてもらえますか?arm-elfターゲットにはgccを使用しています。

Janに関して

4

1 に答える 1

7

このアプリケーションノートを確認してください。ダイナミックリンクがどのように機能するか、そして独自のダイナミックローダーを作成するために何をする必要があるかを詳細に説明しています。また、それに代わるものもいくつかあります。ジャンプテーブルの実装は非常に簡単で、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);
  //...
}

お役に立てれば!

于 2011-04-11T14:37:23.110 に答える