【问题标题】:How to place a variable at a given absolute address in memory (with Visual C++)如何将变量放置在内存中的给定绝对地址(使用 Visual C++)
【发布时间】:2013-01-24 22:29:16
【问题描述】:

如何静态地告诉 Visual C++ 将全局变量放置在内存中给定的绝对地址处,例如 __attribute__((at(address))) does

【问题讨论】:

  • 这通常不是链接器的工作吗?恐怕我不是真正的 VC++ 专家。
  • 不久前我收到了same question
  • @CarlNorum:是的,有时……有时还有#pragmas。如果有一个链接器选项可以做到这一点,那么它也可以工作,我并不是要专门将它限制在编译器中(尽管 pragma 是首选)。
  • @Chris,这不是同一个问题。
  • @Chris,Mehrdad 希望将变量放置在特定的构建时定义的地址,而不是在运行时将其放置在系统提供的地址。

标签: c++ visual-c++ portable-executable


【解决方案1】:

可以做到,但我不相信有预定义的方法可以做到这一点,因此需要进行一些实验。即使在用户代码执行开始时在运行时创建变量,我也没有看到太多好处。

所以首先使用allocate MS specific 说明符指定要在其中初始化变量的部分/段。然后在真实场景中启动您的应用程序,转储它或调试它并查看变量出现的位置。注意重定位(有一些方法可以尝试强制不重定位,但不能保证始终遵守)。另一种方法是在您的应用程序中使用一些代码like this 来查找您定义的部分的地址。

如果您由于某种原因无法获得一致的行为,您可以使用this utility 来操作目标文件的虚拟地址。总而言之,除了一路上的障碍,但总的来说,如果你足够坚持,我不明白为什么你不能让它为你的特定场景工作。

【讨论】:

  • 因此,如果我可以让链接器将给定的部分放入内存中的特定位置,那么剩下的就很容易了。 (正如你所说,只需使用allocate 为变量创建一个新部分。)所以我想问题是我们是否可以强制链接器将特定部分放置在某个地方。
  • 我找不到明确指定的方法(即更改目标文件的虚拟地址)。我猜可以做的是在链接步骤之前编写一个小实用程序或脚本来操作目标文件......但我认为重定位在它被加载到内存时仍然会导致问题。我不知道是否有一个健全的解决方案可以在所有情况下一直有效。可能有,但如果可能的话,我会在运行时这样做,这非常简单,但我想你有一些特殊要求不允许你在运行时这样做。
  • 是的,我不能在运行时这样做,因为不幸的是,当我需要这个变量时动态内存分配不是一个选项。 :\ 我会看看你的答案,谢谢你的建议。 +1
  • EDITBIN 手册在哪里提到了操作节的虚拟地址的能力? msdn.microsoft.com/en-us/library/ddxkx21d.aspx 没有提到这个...
猜你喜欢
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2013-08-29
相关资源
最近更新 更多