9

位置依存コードと位置非依存コードの違いは何ですか?

また、例を使用して独自の静的および動的ライブラリを実装/呼び出すにはどうすればよいですか?

4

3 に答える 3

10

位置に依存しないコードは、コードがメモリにロードされている場所であればどこでも正しく実行できます。これは通常、関数呼び出しに相対ジャンプを使用することで実現されます。相対ジャンプでは、コード ストリーム内の現在位置からジャンプ アドレスが計算されるため、コードは次のようになります。「現在位置から 585 バイトジャンプ」または「5745 バイトジャンプ」 「アドレス 0x46fae55 にジャンプ」ではなく、このモジュールのベースアドレスから」同様に、メモリ アドレスを参照するその他の命令については、現在のコード位置に対して相対的に、または実行時に決定されるベース アドレスに対して相対的に書き込む必要があります。

メモリ管理ユニット (MMU) と仮想メモリ アドレスを使用すると、実行可能ファイルの位置に依存しないコードはほとんど時代遅れになります。ただし、共有ライブラリは、実行可能ファイルのアドレス空間内の任意の位置にマップできるため、位置に依存しないコードとして作成する必要があります。

于 2013-02-04T05:48:19.973 に答える
8

初期のコンピューターでは、コードは位置に依存していました。各プログラムは、特定のアドレスに読み込まれ、そこから実行されるように構築されていました。別々のプログラムを使用して複数のジョブを同時に実行するには、2 つのジョブが同時に同じロード アドレスを必要とするプログラムを実行しないように、オペレーターは慎重にジョブをスケジュールする必要がありました。

たとえば、給与計算プログラムと売掛金プログラムの両方がアドレス 32K で実行されるように作成されている場合、オペレーターは両方を同時に実行することはできません。場合によっては、オペレータは、オプションを拡張するために、それぞれが異なるロード アドレス用にビルドされた複数のバージョンのプログラムを保持していました。

物事をより柔軟にするために、位置に依存しないコードが発明されました。位置に依存しないコードは、オペレーターがロードすることを選択した任意のアドレスから実行できます。位置に依存しないコードは、ユーザーレベルのアプリケーションの作業を調整するためだけでなく、オペレーティング システム内でも使用されてきました。

于 2013-02-04T05:36:50.747 に答える
3

Lie Ryan の回答に追加する - これは C プログラミング言語の問題ではなく、システム アーキテクチャの問題です。

たとえば、Intel x86 セグメント化アーキテクチャは、OS が cs=ds=es=ss を 2^16 の異なる値にロードできる、.com 形式の小さな実行可能ファイルを半自動的に配置する独立したロードをサポートしていました。

.exe 形式の OTOH では「再配置」が導入されました。つまり、実行可能ファイルにはオフセットの配列 (バイナリの読み込みアドレスに関連する) があり、読み込みアドレスを追加する必要があります。

  relocation_table:  // list of values to be modified
          0022, 0100, ...
  .text 
  0020:   xx yy 12 00      mov ax,[0x0012]   <-- the "absolute address" 0012 is
  // located at address 0022 in the binary -- that has to be added with the real 
  // location of the the "position-independent" code
于 2013-02-04T08:14:17.080 に答える