【问题标题】:Linker replacing symbolic references with memory addresses?链接器用内存地址替换符号引用?
【发布时间】:2015-10-14 18:44:45
【问题描述】:

来自http://blog.jamesdbloom.com/JVMInternals.html 我发现了这个

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

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

【问题讨论】:

  • 链接器输出相对地址,操作系统在加载程序时将其转换为绝对地址。
  • 那么程序内部使用和定义的所有变量和对象的地址与程序执行时的起始地址有固定的关系吗?暗示如果我加载程序的操作系统有足够的内存但不完全存在于程序将无法运行的相对地址?
  • “不完全存在于相对地址”没有意义。该程序不会在相对地址加载。操作系统在其地址空间中为程序找到空间,将其加载到那里,然后修复地址。请记住,现代操作系统使用虚拟化地址空间,因此每个进程或多或少都有要加载的所有内存。
  • 内存中有连续的空间吗?所以整个程序要么适合一个连续的空间,要么根本没有空间?对不起我的无知,但我时不时地工作。

标签: c++ memory linker


【解决方案1】:

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

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

【讨论】:

  • 我得到了那部分,但我的问题仍然存在。请参考我对问题本身的评论
  • 已编辑,虽然我不太确定您到底在问什么。操作系统确定它包含在它提供给程序的内存空间中的地址,并使用该地址范围来确定将每个相对地址解析到哪里。
猜你喜欢
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 2022-11-17
  • 2015-10-05
  • 2012-03-14
相关资源
最近更新 更多