位置に依存しないコードをコンパイルすることに関心がある理由と、それを避けるべき理由を誰かが説明できますか?
3 に答える
コードを位置に依存しないようにすると、抽象化のレイヤーが追加されます。これには、実行時に特定の操作 (通常は静的ストレージを使用した変数へのアクセスに関連するもの) の追加のルックアップ ステップが必要です。
したがって、必要ない場合は使用しないでください。
PIC を生成しなければならない特定の状況 (つまり、プラグイン モジュールやライブラリなどの実行時に読み込み可能なコードを作成する場合) がありますが、追加された柔軟性には代償が伴います。
悲惨な詳細は、実行可能ファイルをビルドしているかライブラリをビルドしているかによって、ローダーがどのように機能するかによって異なりますが、これはビルド システムとコンパイラの問題であり、ユーザーの問題ではないという感覚があります。
本当に理解したい場合は、実行が開始される前にコードがアドレス空間に配置される場所と、チップが提供する分岐命令のセットを考慮する必要があります。ブランチは相対的ですか、それとも絶対的ですか? データセグメントへのアクセスは相対か絶対か?
分岐が絶対的な場合、コードを信頼できるアドレスにロードする必要があります。そうしないと機能しません。それは位置依存のコードです。多くの単純な (または古い) オペレーティング システムは、プログラムを常に同じ場所にロードすることでこれに対応しています。
相対分岐とは、 をメモリ内の任意の場所に配置できることを意味します。それは位置に依存しないコードです。
繰り返しますが、知る必要があるのは、プラットフォームでコンパイラとリンカーを呼び出すためのレシピだけです。
コンパイラは相対アドレス オフセットをエンコードする命令を使用できないため、通常、PIC コードは少し大きくする必要があります。PIC がなければ、現在の PC に対して 16 ビットまたは 8 ビットで多くのアドレスをエンコードできます。組み込みシステムでは、PIC が役立つ場合があります。たとえば、さまざまな物理アドレスで実行できるパッチ コードが必要な場合です。