我有一个由混合 C 和 x86 汇编代码组成的应用程序。由于复杂的原因,汇编代码想知道(声称的程序计数器)值是否是 C 代码的目标代码所在区域中的地址。这个应用程序过去运行良好,包括这个古怪的检查。
我真正需要的只是我信任其地址的 C 代码区域上的“书挡”。这当然假设编译后的 C 代码相对密集地存放在加载映像中。
我目前通过定义虚拟函数 LowestAddress(){} 和 HighestAddress(){} 并将它们分别放在包含代码的文件中的第一个和最后一个来获得我的书挡。汇编代码只是将感兴趣的值与这些函数的地址进行比较,以确定该值是否在 C 代码范围内。糟糕,这是第二个假设,即函数在内存中按源文件文本顺序排序,这在 Visual Studio 的旧版本中显然是正确的。
唉,不再,肯定不是 VS2010 编译链接时代码生成。(我不知道其他 [非] 优化设置有什么作用。)使用 VS2010 检查时,我的 LowestAddress 函数显然位于一堆其他 C 函数的目标代码中间。
我如何(重新)实现这些书挡?某种分段控制?VS 2010 中可用于构建的选项似乎没有提供任何有用的东西。(我知道一个非常聪明的编译器实际上可能会重新安排代码,以根据调用图最小化缓存行冲突。MS 真的那么聪明吗?)。我并不是真的坚持按文本顺序对这个区域的所有功能进行排序;我只需要该区域的上限和下限。
[我将尝试关闭链接时代码生成,这是唯一可以构建 [全局] 调用图的地方,看看会产生什么影响。]