gpt4 book ai didi

c++ - 在 Windows 中检索已编译函数的大小

转载 作者:可可西里 更新时间:2023-11-01 09:34:03 27 4
gpt4 key购买 nike

我正在寻找一种方法来确定已编译函数的大小(以字节为单位)。

我做了一点研究,在大多数编译器上你不能使用 sizeof(functionName)。我查看了 PE32 header ,但只能找到其中列出的入口点地址。

使用 GCC 时,我认为您可以使用链接描述文件,并且 it seems the info is also contained in the ELF file headers .

但是,这些解决方案仅适用于 Unix。有没有办法在Windows中做到这一点?我正在使用 Visual Studio 并想知道链接器是否能够做到这一点。

另一种方法是机器代码分析(跟踪 jmps 和 ret 操作码;我不知道这有多可靠),但这似乎很难实现。

编辑:有几个人问我为什么要这样做。我不考虑这部分问题,但我想通过在另一台计算机上运行某些计算密集型功能来运行一些测试。真的,只不过是试验而已。我认为这是比每次发送代码并重新编译更有效的解决方案。 (所以,也许分类为“XY 问题”可能是正确的)。

我知道优化会阻止函数成为漂亮的代码“ block ”,但我认为可以避免这种情况(通过使用函数指针或编译器指令:这就是我将函数包含在导出表中的方式当我试图从 PE 数据中提取函数大小时)。

最佳答案

使用Grouped Sections,使函数按您想要的顺序排列,然后减去函数地址:

#include <stdio.h>
#include <windows.h>

#ifdef _MSC_VER
#define CODE_SEG(seg) __declspec(code_seg(seg))
#else
#define CODE_SEG(seg) __attribute__((section(seg)))
#endif

static CODE_SEG(".text$1") int sum_arr (int *arr, int qty)
{
int sum = 0;
int i;
for (i = 0; i < qty; i++)
sum += arr[i];
return sum;
}

static CODE_SEG(".text$2") int multiply (int m1, int m2)
{
return m1 * m2;
}

CODE_SEG(".text$3") int main( void )
{
printf ("size of sum_arr(): %u\n",
(unsigned)((UINT_PTR)&multiply - (UINT_PTR)&sum_arr));
printf ("size of multiply(): %u\n",
(unsigned)((UINT_PTR)&main - (UINT_PTR)&multiply));

return 0;
}

来自Microsoft Portable Executable and Common Object File Format Specification :

Grouped Sections (Object Only)

The “$” character (dollar sign) has aspecial interpretation in section names in object files.

Whendetermining the image section that will contain the contents of anobject section, the linker discards the “$” and all characters thatfollow it. Thus, an object section named .text$X actually contributesto the .text section in the image.

However, the characters followingthe “$” determine the ordering of the contributions to the imagesection. All contributions with the same object-section name areallocated contiguously in the image, and the blocks of contributionsare sorted in lexical order by object-section name. Therefore,everything in object files with section name .text$X ends up together,after the .text$W contributions and before the .text$Y contributions.

The section name in an image file never contains a “$” character.

关于c++ - 在 Windows 中检索已编译函数的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22525694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com