ELF ファイルのベースアドレスを見つけようとしています。readelf を使用して、プログラム エントリ ポイントとさまざまなセクションの詳細 (ベース アドレス、サイズ、フラグなど) を見つけることができることを知っています。
たとえば、x86 アーキテクチャのプログラムは、リンカーによって 0x8048000 に基づいています。readelf を使用すると、プログラムのエントリ ポイントを確認できますが、出力の特定のフィールドにベース アドレスが示されません。
$ readelf -e test
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x8048390
Start of program headers: 52 (bytes into file)
Start of section headers: 4436 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 9
Size of section headers: 40 (bytes)
Number of section headers: 30
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 08048154 000154 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048168 000168 000020 00 A 0 0 4
[ 3] .note.gnu.build-i NOTE 08048188 000188 000024 00 A 0 0 4
[ 4] .gnu.hash GNU_HASH 080481ac 0001ac 000024 04 A 5 0 4
[ 5] .dynsym DYNSYM 080481d0 0001d0 000070 10 A 6 1 4
セクションの詳細では、オフセットが ELF のベース アドレスに対して計算されていることがわかります。
したがって、.dynsym
セクションはアドレス 0x080481d0 から始まり、オフセットは 0x1d0 です。これは、ベース アドレスが 0x08048000 であることを意味します。これは正しいです?
同様に、PPC、ARM、MIPS などの異なるアーキテクチャでコンパイルされたプログラムの場合、それらのベース アドレスは表示されず、OEP、セクション ヘッダーのみが表示されます。