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