試行錯誤せずに、セグメントがメモリ内のどのセクションにマップされているかをどのように見つけることができますか?
実行可能ファイルについて話すとき、セクションとセグメントには特定の意味がELF
あり、上記の使用法はその意味と一致しません。
ELFセクションはロード時に重要ではなく、(ロード可能な)セグメントのみが重要です。
このreadelf -l a.out
コマンドは、ELFセクションからセグメントへのマッピングを正確に提供します。例えば
readelf -l /bin/date
Elf file type is EXEC (Executable file)
Entry point 0x8048c60
There are 6 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x000c0 0x000c0 R E 0x4
INTERP 0x0000f4 0x080480f4 0x080480f4 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x05fe0 0x05fe0 R E 0x1000
LOAD 0x006000 0x0804e000 0x0804e000 0x00208 0x00334 RW 0x1000
DYNAMIC 0x006078 0x0804e078 0x0804e078 0x000c8 0x000c8 RW 0x4
NOTE 0x000108 0x08048108 0x08048108 0x00020 0x00020 R 0x4
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata
03 .data .eh_frame .dynamic .ctors .dtors .jcr .got .bss
04 .dynamic
05 .note.ABI-tag
これは.ctors
、書き込み可能なセグメント3にマップされていることを示しています(この出力は古代のUnitedLinux 1.0
分布からのものです)。
現在は、.ctors
とは別のセグメントに入れられ、.data
特別なセグメントを介した再配置後の書き込みから保護されていGNU_RELRO
ます。