ELF実行ファイルには固定ロードアドレス(32ビットx86 Linuxバイナリでは0x804800、64ビットx86_64バイナリでは0x40000)があります。なぜELF実行ファイルに固定ロードアドレスがあるのですか?
これらの特定の住所の歴史的理由については、SO回答(例:this one)を読んでいます。私がまだ理解していないのは、無作為化されたロード・アドレスではなく、固定されたロード・アドレスを使用する理由です(ある範囲をランダム化する)。
ELF実行ファイルには固定ロードアドレス(32ビットx86 Linuxバイナリでは0x804800、64ビットx86_64バイナリでは0x40000)があります。なぜELF実行ファイルに固定ロードアドレスがあるのですか?
これらの特定の住所の歴史的理由については、SO回答(例:this one)を読んでいます。私がまだ理解していないのは、無作為化されたロード・アドレスではなく、固定されたロード・アドレスを使用する理由です(ある範囲をランダム化する)。
固定ロードアドレスではなく、無作為化1
-fPIE
と-pie
フラグでリンクするPIE
バイナリ(実際にはスタートアップコードを持つ共有ライブラリの特別なケースです)をビルドします。-fPIE
でビルドすると、実行時のオーバーヘッドが発生することがあります。パフォーマンスが10%低下することもありますが、大規模なクラスタやパフォーマンスの最後のビットが必要な場合には許容できません。ランタイムオーバーヘッドについて詳しく説明したり、リンクを張ったりできますか? –
私があなたの質問を正しく理解しているかどうかわかりませんが、それは「従来の」/歴史的な問題ではなく、ELFはUNIX由来のオペレーティングシステムであるPOSIX(IOS)とUnixのような(Linux)。
とelf形式では、コードがロードされてから実行されるいくつかの解決された絶対アドレスと絶対アドレスが必要であることだけが記載されています。 そして単にファイル形式がどのようなものか、変更される可能性があります。実行可能ファイルを任意のメモリアドレスに "スロー"できず、ELF形式が導入された90年代には正常に実行されました。 elf形式は絶対アドレスを持つことに決めました。
また、elf形式を見てみましょう。https://en.wikipedia.org/wiki/Executable_and_Linkable_Format 実行可能ファイルを処理して、任意の仮想アドレスにロードできるOS実行可能ローダをどのように設計すればいいですか?実際にはバイナリ自体を変更する必要があります...もしあなたが出力コンパイラが生成するものを大幅に変更する必要があるか、フォーマット自体を変更する必要がある場合は、もう一度可能ではない、
時間が経過すると位置独立型実行(PIE/PIC)の要件は、これを可能にするために導入されたオブジェクトを提起して共有しています。 (アドレス空間レイアウトのランダム化) - コードがスローされる可能性があることを意味しますコード内のすべての呼び出しが実行された命令の現在のアドレスと相対的であることを確認することによって単純に実装され、共有オブジェクトがロードされたときにOSローダーが変更されたデータが実行可能命令(RE)ではなく、いくつかの "ジャンプテーブル"(ロード時に変更される)から関数を呼び出すことによって実装される実際のデータ(RW、例えばデータセグメント)である場合、時間)、例えばPLT/GOT ....これらの共有オブジェクトは、コードがロードされるアドレスの絶対ランダム化を許可し、より安全なコードを実行したい場合、共有オブジェクトとしてコンパイルする必要があります。動的にリンクして時間や実行時間を読み込みます。
(私はいくつかのことをクリアしたいと思っています:)
私はELFについてよく分かりませんが、通常は少なくとも再配置なしでロードするチャンスがあることです。 –