ld.so
ランタイムリンカ()とプログラムの違いは何ですかprelink
?ランタイムリンカ(ld.so
)がプログラムに必要なすべての動的ライブラリをロードすることを知っていますが、利点は何ですかprelink
?どちらも同じことをしていませんか?
ベストアンサー1
これは大幅に扱われます。prelink
マンページ:
prelink
動的リンカーが起動時に再配置を実行するのに必要な時間を大幅に短縮するように、ELF共有ライブラリとELF動的にリンクされたバイナリを変更するプログラム。再配置が少ないため、ランタイムメモリの消費も減ります(特に共有できないページ数)。辞書リンク情報は、辞書リンク以降に依存ライブラリが変更されていない場合の起動時にのみ使用されます。それ以外の場合、プログラムは正常に再配置されます。
prelink
事前にリンクするELFバイナリとそれらが依存するELF共有ライブラリを収集することから始めます。次に、各ライブラリに一意の仮想アドレス空間スロットを割り当て、共有ライブラリをそのベースアドレスに再接続します。動的リンカーがこれらのライブラリをロードしようとすると、その仮想アドレス空間スロットがすでに占有されていない限り、ライブラリは指定されたスロットにマッピングされます。これが完了すると、prelink
ダイナミックリンカーの助けを借りて、バイナリまたはライブラリのすべての再配置が依存ライブラリに対して解決され、再配置はELFオブジェクトに格納されます。また、すべての依存ライブラリのリストとそのチェックサムをバイナリファイルまたはライブラリに保存します。バイナリファイルの場合、リストも計算します。紛争 (依存ライブラリのより小さな検索範囲とは異なり、バイナリのシンボル検索範囲で解決されます)特殊ELFセクションに保存されます。実行時に、動的リンカーはまず、すべての依存ライブラリが指定されたアドレス空間スロットに正常にマップされたこと、および事前リンクが完了してから変更されていないことを確認します。すべてのスキャンが成功すると、動的リンカーはすべてのライブラリを再配置するのではなく、競合リスト(通常は再配置の総数よりはるかに短い)のみを再生します。
ld.so
との主な違いprelink
は、電子は動的にリンクされたバイナリがロードされるたびに実行されることです。バイナリの動的リンクに関連するライブラリの再配置を事前に計算して、起動時にプログラムがprelink
占める時間とメモリを減らそうとします。ld.so
これらの再配置はバイナリに保存され、ld.so
その情報を使用してまだ有効かどうかを確認できます。独自の再配置をスキップします(事前に接続された再配置が有効な場合)。
使用すると、prelink
特に次のような多くの不利な結果が発生します。
- これはバイナリを修正します。つまり、バイナリが変調されていることを確認するために、「ソース」(パッケージなど)と比較することはできません。
- これにより、固定再配置が発生し、アドレス空間レイアウトのランダム化範囲が大幅に減少し、システムのセキュリティが低下します(事前にリンクされた特定のバイナリの場合、リンクされたライブラリが変更されない限り、再配置は変更されません。ガジェットを悪用したい攻撃者に役立ちます。