2

私は楽しみのためだけに独自のプログラミング言語を書いています。現在、スタックベースの仮想マシン、中間言語/アセンブリ言語、および高レベルのコンパイラがあります。とにかくすべてが機能しますが、コンパイルされたコード ライブラリを動的にリンクする必要があります。問題は、アセンブラが外部ライブラリからの個々のメソッドのアドレスを知る必要があることです。C++ コンパイラまたは Java コンパイラは、この問題をどのように正確に処理しますか?

4

1 に答える 1

1

静的にリンクされた実行可能ファイルの場合、リンカーは関数呼び出しを実際のアドレスと照合する責任があります。1 つのオブジェクト ファイルには、別の場所にある関数へのシンボリック参照(アドレスではなく名前を意味する) が含まれ、リンカはリンク時にそれを他のオブジェクト ファイルまたはライブラリのシンボル定義と照合します。この方法を使用するには、リンカーが理解できるオブジェクト ファイルにネイティブ マシン コードを生成する必要があります。

VM の状況により適している可能性があるもう 1 つのオプションは、プログラムが実行時にリンクされた関数のアドレスを取得する動的リンクを使用することです。これを行う正確な方法はプラットフォームによって異なります。Windows では and を使用LoadLibraryGetProcAddress、Unix スタイルのプラットフォームでは and を使用dlopendlsymます。

于 2012-06-13T22:23:25.917 に答える