我正在试验Pin,一种检测工具,我用它来根据我的变量的内存地址计算一些统计数据。我想用我的检测工具收集的信息重新运行我的程序,但为此,虚拟内存地址在不同的运行中保持相同是至关重要的。
一般来说,我应该让操作系统处理内存分配,但在这种情况下,我需要某种方式来强制它始终分配给相同的虚拟地址。特别是,我对一个非常长的数组感兴趣,我目前正在分配它numa_alloc_onnode()
,尽管我可以使用其他东西。
正确的方法是什么?
谢谢
我正在试验Pin,一种检测工具,我用它来根据我的变量的内存地址计算一些统计数据。我想用我的检测工具收集的信息重新运行我的程序,但为此,虚拟内存地址在不同的运行中保持相同是至关重要的。
一般来说,我应该让操作系统处理内存分配,但在这种情况下,我需要某种方式来强制它始终分配给相同的虚拟地址。特别是,我对一个非常长的数组感兴趣,我目前正在分配它numa_alloc_onnode()
,尽管我可以使用其他东西。
正确的方法是什么?
谢谢
你可以试试 mmap(2)。
程序的插桩版本将使用与原始程序不同的内存布局,因为 pin 需要用于动态翻译等的内存,并且会改变内存布局。(如果我没记错的话)
除了地址空间布局随机化之外,大多数用于分配虚拟内存地址的内存分配器、加载器和系统例程将在相同的调用和数据的情况下返回相同的结果(不是故意设计的,而是软件工作方式的自然结果) . 因此,您需要:
地址空间布局随机化是故意更改地址空间以挫败攻击者:如果在每个程序执行中更改地址,则攻击者更难以使用各种漏洞来控制执行的代码。它应该只暂时禁用并且仅用于调试目的。此答案显示了一种执行此操作的方法并链接到更多信息,但确切的方法可能取决于您使用的 Linux 版本。
由于各种原因,您的程序可能会以不同的方式执行,例如使用线程或使用异步信号或进程间通信。您可以在程序中控制它。
通常,不能保证内存分配是可重现的。您获得的结果可能是基于原样的。