私は32ビットのシステムテキストセクションで常に0x0848000で始まる本を読みました(名前を思い出すことはできません)。しかし、私がreadelf -S example_executable
をするとき、それは同じ情報を反映していません。何故ですか?他のセクション(bss、データ、rodataなど)も固定アドレスから始まっていますか?これらのセクションの境界線の境界を見つけるにはどうすればよいですか?テキストセクションはどのアドレスから始まりますか?
答えて
ここでは、特定のプログラム用にストレージを割り当てる際に、Linux仮想メモリがどのように機能するかについて説明します。 ua alberta - linux memory allocation
コンパイラ/リンカーツールチェーンの設計者は、特定のメモリブロックに任意のアドレスを割り当てる必要があります。デバッガやプロファイラのようなツールチェーンの他のコンポーネントを簡単にするために、同じブロックを常に同じアドレスに割り当てます。選択された実際のアドレスは完全に任意です。
プログラムがロードされると、仮想アドレスはランダムな空きメモリにマップされます(これはハードウェアで行われます)。このマッピングは、いくつかのプログラムが仮想アドレスx'0848000 'をアドレスすることができるが、異なる「実際の」メモリアドレスを指し示すことができるように、プロセスごとに行われる。
+1すばらしいリファレンス! – Beginner
アドレスの選択は完全に恣意的ではありません。いくつかの選択肢が他の選択肢より優れています。特に、テキストセグメントを '0x60000000'にすると、アプリケーションが使用できる最大の' mmap'サイズがおよそ半分になります... –
オペレーティングシステムとアーキテクチャの間に、テキストセクションまたは他のセクションの一貫したアドレスはありません。さらに、位置独立コードおよびアドレス空間レイアウトのランダム化により、これらの値は、一部のシステムでは同じマシン上でも一貫性がありません。
これはすべて特定のマシンの実装に依存します.Linuxマシンの場合、Windowsマシンとは動作が異なります。 ただし、仮想メモリアドレスは、デバッガの作業を容易にするために、固定アドレスで開始する必要があります。実際のアドレスは、RAMで使用可能なページによって異なります。 readelf -Sの出力をもっと慎重に調べると、アドレスからのオフセットを減算して0x0848000が得られます。 私が先に触れたように、のマジックナンバー0x0848000は、実行形式のタイプによって異なります。これらの境界の
readelf -S ~/a.out
There are 29 section headers, starting at offset 0x1130:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 08048134 000134 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048148 000148 000020 00 A 0 0 4
[ 3] .note.gnu.build-i NOTE 08048168 000168 000024 00 A 0 0 4
[ 4] .gnu.hash GNU_HASH 0804818c 00018c 000020 04 A 5 0 4
[ 5] .dynsym DYNSYM 080481ac 0001ac 000050 10 A 6 1 4
[ 6] .dynstr STRTAB 080481fc 0001fc 00004c 00 A 0 0 1
[ 7] .gnu.version VERSYM 08048248 000248 00000a 02 A 5 0 2
[ 8] .gnu.version_r VERNEED 08048254 000254 000020 00 A 6 1 4
[ 9] .rel.dyn REL 08048274 000274 000008 08 A 5 0 4
[10] .rel.plt REL 0804827c 00027c 000018 08 A 5 12 4
[11] .init PROGBITS 08048294 000294 000030 00 AX 0 0 4
[12] .plt PROGBITS 080482c4 0002c4 000040 04 AX 0 0 4
[13] .text PROGBITS 08048310 000310 00018c 00 AX 0 0 16
[14] .fini PROGBITS 0804849c 00049c 00001c 00 AX 0 0 4
- 1. 実行可能ファイルのテキストセクションの開始アドレスと終了アドレスを取得する
- 2. JVMの最適化はどこから始まりますか?
- 3. WP7 Silverlightのコードはどこから始まりますか?
- 4. ゲームは実際にどこから始まりますか?
- 5. CodeIgniterのブログ:モデルはどこから始まり、コントローラーは終了しますか?
- 6. どこから始まるか分かりません
- 7. テキストファイルのデータベースへの変換はどこから始まりますか?
- 8. 各行の始まりはスターで始まりますか?
- 9. メモリマップドI/Oアドレスはどこから得られますか?
- 10. PLPGSQL配列のインデックスは1から始まりますか?
- 11. DateTime.TryPase(DateStringは、ある月から始まり、ある日から始まる)
- 12. あるポインタから始まり、どこから開始するループを作ることができますか?
- 13. 動的シンボルのアドレスはどこから来ますか
- 14. ユニティ・オフセット・サイクルは常に最初から始まりますか?
- 15. Purescriptシグナルは、最初から繰り返し始まります。
- 16. Android:アドレス(GeoCodeから)には固定フォーマットがありますか?
- 17. Warp.jsの日付は前の日付から始まります
- 18. テーブルビューの最後のセクションはnumberOfRowsInSectionから始まります。
- 19. このデータの解析はどこから始めますか?
- 20. このデータベースの設計はどこから始めますか?
- 21. オーバーフロースクロールは、リストの一番下から始まります。
- 22. 新しいAjaxUploadは他のボタンから始まります
- 23. Excel QueryTableの行番号は1から始まります
- 24. Androidのレイアウトは<?xml version ...?>から始まります。
- 25. ワトソンの会話は常にルートから始まります
- 26. 絶対パスはどこから始まるのですか?
- 27. ホームページの変更はどこから始めますか?
- 28. 範囲のアドレスはどこにありますか?
- 29. Javaプログラミングを開始するには、どこから始めますか?
- 30. オプティミスティックロックはnilで始まりますか?
多くが原因でアドレス空間レイアウトのランダム化(ASLR)の最新のオペレーティングシステム上でランダム化されています。 は、ここで私は私のUbuntuの32ビットマシンに乗る出力されます。 – bcr