从http://blog.jamesdbloom.com/JVMInternals.html我发现了这个
C / C ++代码通常被编译为目标文件,然后将多个目标文件链接在一起以产生可用的工件,例如可执行文件或dll。在链接阶段,每个目标文件中的符号引用将替换为相对于最终可执行文件的实际内存地址。
如果运行可执行文件的操作系统是负责在运行时分配内存的操作系统,并且只要有空闲内存空间就可以分配内存,那么如何确定链接期间的相对内存地址(我对事情的理解)工作)。
答案 0 :(得分:1)
内存地址相对于最终的可执行文件 - 它们不是绝对的,在链接期间无法确定。
在Windows中运行可执行文件时,操作系统会授予固定大小的虚拟内存空间或虚拟地址空间,通常为32位的4GB操作系统。每个进程都有自己的虚拟空间,可以在内存中读写数据。然后,可执行文件和任何依赖项将写入此空间,因此它们的位置现在已知并且在VAS中。现在,在执行时,操作系统将获取链接器提供的相对地址并将它们转换为绝对地址。这些由虚拟内存空间中可执行文件的位置决定。