我通过在Linux下使用pmap查看进程映像:
08048000 0 4 0 r-x-- [my program]
08049000 0 4 4 rw--- [my program]
上述三个部分是代码、只读数据和可读写数据段,它们都对齐到页面大小(4K),但当我输入命令objdump -h时,ELF头显示如下:
read-only code segment
Load off 0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12
filesz 0x00000448 memsz 0x00000448 flags r-x
read/write data segment
Load off 0x00000448 vaddr 0x08049448 paddr 0x08049448 align 2**12
filesz 0x000000e8 memsz 0x00000104 flag rw-
据ELF头文件所述,代码段和数据段分别从虚拟地址0x08048000、0x049448开始寻址,这与内存中的进程映像不同。我知道代码/数据段应该被分配到不同的PAGESIZE中,以便为它们提供不同的保护权限。但是,如果实际的虚拟地址与ELF二进制文件不同,程序如何执行?