2011-12-06 5 views
3

私は32ビットのシステムテキストセクションで常に0x0848000で始まる本を読みました(名前を思い出すことはできません)。しかし、私がreadelf -S example_executableをするとき、それは同じ情報を反映していません。何故ですか?他のセクション(bss、データ、rodataなど)も固定アドレスから始まっていますか?これらのセクションの境界線の境界を見つけるにはどうすればよいですか?テキストセクションはどのアドレスから始まりますか?

+1

多くが原因でアドレス空間レイアウトのランダム化(ASLR)の最新のオペレーティングシステム上でランダム化されています。 は、ここで私は私のUbuntuの32ビットマシンに乗る出力されます。 – bcr

答えて

4

ここでは、特定のプログラム用にストレージを割り当てる際に、Linux仮想メモリがどのように機能するかについて説明します。 ua alberta - linux memory allocation

コンパイラ/リンカーツールチェーンの設計者は、特定のメモリブロックに任意のアドレスを割り当てる必要があります。デバッガやプロファイラのようなツールチェーンの他のコンポーネントを簡単にするために、同じブロックを常に同じアドレスに割り当てます。選択された実際のアドレスは完全に任意です。

プログラムがロードされると、仮想アドレスはランダムな空きメモリにマップされます(これはハードウェアで行われます)。このマッピングは、いくつかのプログラムが仮想アドレスx'0848000 'をアドレスすることができるが、異なる「実際の」メモリアドレスを指し示すことができるように、プロセスごとに行われる。

+1

+1すばらしいリファレンス! – Beginner

+0

アドレスの選択は完全に恣意的ではありません。いくつかの選択肢が他の選択肢より優れています。特に、テキストセグメントを '0x60000000'にすると、アプリケーションが使用できる最大の' mmap'サイズがおよそ半分になります... –

1

オペレーティングシステムとアーキテクチャの間に、テキストセクションまたは他のセクションの一貫したアドレスはありません。さらに、位置独立コードおよびアドレス空間レイアウトのランダム化により、これらの値は、一部のシステムでは同じマシン上でも一貫性がありません。

2

これはすべて特定のマシンの実装に依存します.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 
関連する問題