我知道这两者之间的关系:
虚拟地址除以分页对齐数 == 文件偏移量除以分页对齐数
但是有人能告诉我这两个数字是按照哪个方向计算的吗?
是根据上述关系从文件偏移计算虚拟地址,还是反过来?
更新
以下是更多细节:链接器写入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
我们可以看到有2个LOAD段。
第一个LOAD的虚拟地址以0x8048154结尾,而第二个LOAD从0x8049154开始。
在ELF文件中,第二个LOAD紧随第一个LOAD的后面,文件偏移量为0x00154。但是当这个ELF被加载到内存中时,它会从第一个LOAD段结束后的0x1000字节处开始。
但是,为什么呢?如果我们考虑内存页面对齐,为什么第二个LOAD段不从0x80489000开始呢?为什么它要从第一个LOAD段结束后的0x1000个字节处开始?
我知道第二个LOAD的虚拟地址满足以下关系:
虚拟地址mod页面对齐==文件偏移mod页面对齐
但我不知道为什么一定要满足这个关系。