【发布时间】:2012-08-19 14:48:54
【问题描述】:
我有一个包含混合 C 和 x86 汇编代码的应用程序。由于复杂的原因,汇编代码想知道(声称的程序计数器)值是否是 C 代码的目标代码所在区域中的地址。这个应用程序过去运行良好,包括这个古怪的检查。
我真正需要的只是 C 代码区域上的“书挡”,我信任其地址。 这当然假设编译后的 C 代码相对密集地存放在加载镜像中。
我目前通过定义虚拟函数 LowestAddress(){} 和 HighestAddress(){} 并将它们分别放在包含代码的文件中的第一个和最后一个来获得我的书挡。汇编代码只是将感兴趣的值与这些函数的地址进行比较,以确定该值是否在 C 代码范围内。糟糕,这是第二个假设,即函数在内存中按源文件文本顺序排序,这在 Visual Studio 的旧版本中显然是正确的。
唉,不再,肯定不是 VS2010 编译链接时代码生成。 (我不知道其他 [非] 优化设置有什么作用。)使用 VS2010 检查时,我的 LowestAddress 函数显然位于一堆其他 C 函数的目标代码中间。
我如何(重新)实现这些书挡? 某种段控制? VS 2010 中可用于构建的选项似乎没有提供任何有用的东西。 (我知道一个非常聪明的编译器实际上可能会根据调用图重新排列代码以最小化缓存行冲突。MS 真的那么聪明吗?)。我并不是真的坚持按文本顺序对该区域中的所有功能进行排序;我只需要区域的上限和下限。
[我将尝试关闭链接时代码生成,这是唯一可以构建[全局]调用图的地方,看看有什么效果。]
【问题讨论】:
-
欢迎来到 Stack Overflow!请注意,标签不是关键字。也就是说,stuf-等待。 33k 代表,您刚刚创建了新标签
visual和studio?!来吧,艾拉! ;) -
我在输入问题时遇到了一些奇怪的浏览器问题,直到现在才无法访问它。我可能会做对,但有能力的帮助总是好的。
-
我能想到的 2 个选项是链接器选项 /ORDER,您可以使用它指定可执行文件中函数的顺序,也可以在 #pragma 节的帮助下指定节。但我没有尝试这些。
-
你的意思是:msdn.microsoft.com/en-us/library/00kh39zz.aspx? (挖掘“COMDAT”的含义,我的链接器命令行包括“/Gy-”,我认为它会将其关闭。... COMDAT 似乎将函数单独打包,以便可以对它们使用 /ORDER 命令。也许就是这样正确答案。我需要一些时间去试试这个。
-
@Christopher:/ORDER 指令被证明是诀窍,使用我的虚拟函数作为第一个并列出列表中的元素。我必须在包含我想要订购的函数的文件上使用“/Gy-”函数,并且必须构建一个包含链接编辑函数名称列表的文件,但这一切都有效。 (我从来没有弄清楚 COMDAT 的确切含义,但我不在乎 :) 最后,一个 MS 功能可以做到它所说的不流泪!发布一个真实的答案,这样我就可以给你信用。
标签: visual-studio linker object-code