一部の回答は、バイナリ全体がマップされることを暗示しているため、誤解を招く可能性があります。いいえ、違います。すべてがマッピングされるわけではありません。
証拠:
$ cat /proc/self/maps
**08048000**-08052000 r-xp 00000000 08:03 78433 /bin/cat
**08052000**-08053000 rw-p 0000a000 08:03 78433 /bin/cat
...
マッピングされるのは、 の 2 つの部分だけです。なんで?これらは DT_LOAD 型を持つ唯一のものであるため:
$ readelf -l /bin/cat
Elf file type is EXEC (Executable file)
Entry point 0x8049cf8
There are 8 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 **0x08048000** 0x08048000 0x09ba0 0x09ba0 R E 0x1000 <<
LOAD 0x00a000 **0x08052000** 0x08052000 0x00228 0x00804 RW 0x1000 <<
DYNAMIC 0x00a014 0x08052014 0x08052014 0x000c8 0x000c8 RW 0x4
NOTE 0x000148 0x08048148 0x08048148 0x00044 0x00044 R 0x4
GNU_EH_FRAME 0x008c48 0x08050c48 0x08050c48 0x002a4 0x002a4 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
また、仮想アドレスが ELF ファイルで定義されているものと同じであることもわかります。
実際には、ファイルの最初の 40 KiB (0x8052000-0x8048000 = 40960 バイト) にしかアクセスできません。ELF ヘッダーにはこれで十分ですが、文字列テーブル (.strtab) はおろか、DWARF .debug ヘッダーにもアクセスできません。
すべての ELF セクションにアクセスしたい場合は、ファイル全体をマップするのが最も簡単です。