我知道两者之间的关系:
虚拟地址mod页面对齐==文件偏移mod页面对齐
但有人能告诉我这两个数字的计算方向是什么?
是否根据上述关系从文件偏移量计算虚拟地址,反之亦然?
下面是一些更详细的信息:当链接器写入ELF文件头时,它设置程序头的虚拟地址和文件偏移量.(段)
例如,有以下输出readelf -l someELFfile:
Elf file type is EXEC (Executable file)
Entry point 0x8048094
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x08048000 0x08048000 0x00154 0x00154 R E 0x1000
LOAD 0x000154 0x08049154 0x08049154 0x00004 0x00004 RW 0x1000
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10
Run Code Online (Sandbox Code Playgroud)
我们可以看到2个LOAD段.
第一个LOAD的虚拟地址以0x8048154结束,而第二个LOAD从0x8049154开始.
在ELF文件中,第二个LOAD紧跟在第一个LOAD后面,文件偏移量为0x00154,但是当这个ELF加载到内存中时,它在第一个LOAD段结束后的0x1000字节处开始.
但为什么?如果我们必须考虑内存页面对齐,为什么第二个LOAD段不是从0x80489000开始?为什么它在第一个LOAD段结束后的0x1000字节处开始?
我知道第二个LOAD的虚拟地址满足关系:
虚拟地址mod页面对齐==文件偏移mod页面对齐
但我不知道为什么必须满足这种关系.