【问题标题】:How memory addresses are assigned at compilation time在编译时如何分配内存地址
【发布时间】:2019-06-23 15:40:56
【问题描述】:

我是 IT 领域的新手,最近我玩了一下调试器和反汇编器。 查看 hopper 工具中的二进制文件,我注意到我们有静态分配给它的内存地址。我的问题是:为什么如果操作系统管理内存(每次运行二进制文件时都会更改函数的地址等),我们在二进制文件中还有一个静态内存地址(?)实际示例:

打开 hopper 中的二进制文件,显示 printf 位于地址 0x11ed,然后在 gdb 中运行程序,显然我们在不同的地址有 printf。是为二进制文件分配静态地址的编译器吗?为什么?有什么推荐的资源来了解更多吗?

【问题讨论】:

标签: memory-address


【解决方案1】:

似乎有两种不同的事情让您感到困惑。

  1. 虚拟地址和实际内存地址的区别。进程从 0 开始分配自己的地址空间。这与实际内存地址 0 无关。映射由操作系统管理,通常在“内存管理单元”的硬件协助下。我的这部分回答解决了关于“操作系统管理内存”的部分问题。

  2. 动态加载的库。地址可能与这样的库相关;从库相对地址到虚拟地址的映射是在库加载到地址空间时分配的。语言运行时库通常作为动态加载的共享库分发。这可能解释了独立运行程序与在调试器下运行程序之间的地址差异。我不知道 'hopper' 是什么,所以我不能确切地说它向您展示了什么。

【讨论】:

  • 非常感谢另一个戴夫的解释,我错过了虚拟地址的那一部分,但我仍然对反汇编程序中指令地址所指的内容感到困惑(如 Ida 料斗等.) 因为我们在反汇编程序中打开文件不是一个进程,因为它没有运行,而是静态分析。我的理解是几乎所有事情都发生在运行时。
猜你喜欢
  • 2013-08-29
  • 2010-10-31
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多