3

同じアドレス空間の異なるアドレスにロードする必要がある 2 つの実行可能ファイルがあるとします。2 つの実行可能ファイルを別々のファイルとして保持したいのですが、一方が他方から関数を呼び出せるようにします。

たとえば、0x1000 にロードする必要がある実行可能ファイル A にvoid foo()0x1ABC の関数が含まれており、0x2000 にロードされている実行可能ファイル B が を呼び出すfoo()場合、実行可能ファイル B のように終了する必要がcall 0x1ABCあります。

これが必要な理由は、おもちゃの OS のためです。割り込みハンドラの場所とカーネル コードの開始場所を知るには、ブートローダーが必要です。すべてを 1 つのファイルにまとめることはできるかもしれませんが、そうはなりません。

現時点では、必要な関数を「適切な」アドレスに手動でロードし、それらへのジャンプを手動で書き込むことで問題を解決しています。それは機能しますが、言うまでもなく、最適ではありません。

4

2 に答える 2

0

1 つのオプションは、2 番目のパスを介して関数のアドレスを提供することです。これは、たとえばファイル、または固定メモリアドレスである可能性があります。システムを完全に制御できる場合は、最新バージョンで問題なく動作するはずです。

于 2013-03-04T14:40:36.937 に答える
0

見つけたようです。ld リンカー スクリプトには、(NOLOAD)既にメモリに存在すると想定できるセクションのオプションがあります。

たとえば、foo.oから関数を呼び出したい場合、コードを含めずbar.oにビルドするリンカー スクリプトは次のようになります。foo.binbar.o

SECTIONS
{ 
  . = 0x1000;
  foo : { foo.o (*) }

  . = 0x2000;
  bar (NOLOAD) : { bar.o (*) }
}
于 2013-03-04T16:19:00.447 に答える