链接器用内存地址替换符号引用

Linker replacing symbolic references with memory addresses?

本文关键字:替换 符号 引用 地址 内存 链接      更新时间:2023-10-16

从http://blog.jamesdbloom.com/JVMInternals.html我找到了这个

C/c++代码通常被编译成一个目标文件,然后多个目标文件被链接在一起,以产生一个可用的工件,如可执行文件或dll。在链接阶段,每个目标文件中的符号引用被替换为相对于最终可执行文件的实际内存地址。

如何在链接期间确定相对内存地址,如果运行可执行文件的操作系统是负责在运行时分配内存的操作系统,并且该内存在有空闲内存空间的地方分配(我对事情如何工作的理解)。

内存地址是相对于最终可执行文件的——它们不是绝对的,这在链接过程中是不可能确定的。

当一个可执行文件在Windows中运行时,操作系统会授予它一个固定大小的虚拟内存空间虚拟地址空间,在32位操作系统上通常为4GB。每个进程都有自己的虚拟空间,可以在其中向内存读写数据。然后,将可执行文件和任何依赖项写入该空间,因此它们的位置现在是已知的,并且在VAS中。现在,在执行时,操作系统将获取链接器提供的相对地址并将其转换为绝对地址。这些由可执行文件在虚拟内存空间中的位置决定。