【问题标题】:How can I use the same address in a C program that will be the same every time I restart it如何在 C 程序中使用每次重新启动时都相同的相同地址
【发布时间】:2021-07-24 07:21:30
【问题描述】:

我正在寻找的是每次启动程序时能够获得所有相同的地址或起始地址。例如

地址1 = 0x7ffde3397580

地址2 = 0x7ffde3397584

然后当我重新启动程序时,它将是相同的地址。我写了一个小程序,每次运行它都会从一个新地址开始,例如

地址1 =0x7ffd8f366500

和上面的不一样。 另外,如果您能给我指出一本关于用 c 语言进行内存地址操作的好书或课程,那就太好了。我发现的大部分内容都与分配有关。换句话说,每次我运行程序时,我都想清除并分配完全相同的内存,而不仅仅是内存量。

我用结构、整数、数组和字符编写了几个程序。他们都做同样的事情。如果使用循环,它们将一遍又一遍地显示相同的地址,因为在分配之后它们不应该改变。

我很抱歉这看起来很糟糕,这个编辑器很糟糕,我会花点时间弄清楚。

【问题讨论】:

  • 如果你的程序在不同的内存位置启动,那么你的操作系统已经完成了它的工作。
  • 那么我需要在内核中处理这个问题,是吗?
  • 是的,主要在loader模块中
  • 显而易见的问题 - 你为什么想要/需要这样做?这可能是XY problem
  • 您所看到的称为Address space layout randomization 或ASLR。根据您的操作系统和/或编译器,您可能可以选择退出或禁用它。

标签: c memory


【解决方案1】:

除非您正在编写一个操作系统内核或其他在没有底层操作系统支持的情况下运行的二进制文件(如程序在 16 位甚至更多 8 位时代的运行方式),否则程序最终在内存中几乎完全直到操作系统。

您可以构建一个不可重定位的映像,并且不会与操作系统加载程序想要使用的地址发生冲突,它将运行,但不能保证明天加载程序不会想要使用您需要的地址。

这个问题的通常答案是使用内存映射文件并对映射区域执行偏移计算。偏移量是恒定的(或至少可计算但稳定),而实际地址因运行而异。

【讨论】:

  • OP 看到的变化可能是由地址空间布局随机化引起的,可以禁用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多