1

可能重复:
有没有办法获得 ac 函数的大小?

我需要在运行时确定 ac 函数的字节大小。我正在使用 MSVC,我可以使用该编译器提供的任何技术。

我知道这个问题被问了很多,但我只能发现人们说“不,不可能”。不过,也许我已经监督了一个解决方案。如果是这种情况,请指出我。

4

3 回答 3

4

通常,它以正常的方式生成代码,按照函数在源代码中出现的顺序。所以大小是下一个函数的地址减去函数的地址。

然而,有几种方法不会奏效。首先是增量链接选项,您将得到一个值 5。这是跳转到实际函数的 jmp 指令的大小。这些跳转允许链接器在不完全重新链接图像的情况下替换代码,它只是附加代码并修补跳转地址。

当然还有优化器。当它被内联时,你不能再有意义地谈论函数大小。你需要 __declspec(noinline)。

可以做到,测试一下它并彻底注释代码,这样有一天没有人会插入一个函数。如果您这样做是为了移动代码,请务必记住编译器不会生成与位置无关的代码,也无法修补该代码上的重定位。

于 2012-06-10T19:07:42.460 回答
1

如果你真的有兴趣,从 MSVC 编译成 .asm,然后找出函数开始标签和末尾自定义标签之间的字节差异,计算它们之间的差异。:) 通常,编译器不会生成函数标签的结尾......只是开始。

除非函数需要在内存中重新定位并调用,否则您通常不会使用它!

于 2012-06-10T19:00:42.117 回答
1

认为这应该是可能的。你如何进行的一点点取决于你需要的结果有多准确。如果可以接受某些可能的不准确性,我的首选是SymEnumSymbols. 您提供一个回调函数,该函数会为适合您指定的过滤器的每个符号调用。您的回调函数将被赋予名称和每个符号的计算(猜测)大小。当你找到正确的符号时,你就得到了它为你的函数猜测/计算的大小(虽然要注意:它也可以说大小是 0,所以你可能需要做一些测试才能很好地了解它对你想要的效果有多好)。

一些测试表明这在函数的情况下似乎相当准确(我有点担心这可能是它返回 0 的情况)。请注意,您通常确实希望使用调试信息进行构建以使用它(尽管导出您关心的函数可能就足够了)。

另一种可能性(尽管可能更复杂)是使用#pragma code_seg将您关心的函数单独放在具有唯一节名称的节中,然后遍历 PE 文件以找到该节的大小。

于 2012-06-10T20:15:49.450 回答