Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在windows中检索已编译函数的大小_C++_Windows_Compilation_Linker - Fatal编程技术网

C++ 在windows中检索已编译函数的大小

C++ 在windows中检索已编译函数的大小,c++,windows,compilation,linker,C++,Windows,Compilation,Linker,我正在寻找一种方法来确定编译函数的大小(以字节为单位) 我做了一些研究,在大多数编译器上都不能使用sizeof(functionName)。我查看了PE32标题,只能找到其中列出的入口点的地址 当使用GCC时,我认为您可以使用链接器脚本,并且 但是,这些解决方案仅在Unix上有效。在windows中有什么方法可以做到这一点吗?我正在使用VisualStudio,我想知道链接器是否能够实现这样的功能 另一种方法是机器代码分析(跟踪JMP和ret操作码;我不知道这有多可靠),但这似乎很难实现 编辑:

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

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

当使用GCC时,我认为您可以使用链接器脚本,并且

但是,这些解决方案仅在Unix上有效。在windows中有什么方法可以做到这一点吗?我正在使用VisualStudio,我想知道链接器是否能够实现这样的功能

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

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


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

使用分组部分,因此,函数按您想要的顺序排列,然后减去函数地址:

#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;
}
#包括
#包括
#ifdef硕士学位
#定义代码SEG(SEG)\ declspec(代码SEG(SEG))
#否则
#定义代码SEG(SEG)\属性(节(SEG)))
#恩迪夫
静态代码(“.text$1”)整数和(整数*整数,整数数量)
{
整数和=0;
int i;
对于(i=0;i
从:

分组分区(仅对象)

“$”字符(美元符号)具有 对象文件中节名的特殊解释

什么时候 确定将包含 对象节中,链接器将丢弃“$”和所有 跟着它走。因此,名为.text$X的对象部分实际上起作用 转到图像中的.text部分

但是,下面的字符 “$”确定图像贡献的顺序 节。具有相同对象节名称的所有贡献都是 在映像中连续分配,以及贡献块 按对象节名称按词汇顺序排序。所以,, 节名为.text$X的对象文件中的所有内容都会一起结束, 在.text$W供款之后,.text$Y供款之前

图像文件中的节名称从不包含“$”字符


也许Dumpbin实用程序可能有用。如果你不能直接得到大小,那么可以找到连续的符号并减去它们的偏移量。链接器应该有一个选项来生成输出映射。然后,正如Adam所建议的,您可以减去函数名之间的偏移量以获得函数大小,但这将包括用于对齐函数的填充。复杂的问题是,如果在调试模式下构建,将创建一个跳转表,并且函数名与跳转表中的条目相关联,因此这只能在发布模式下工作。如果编译器优化“内联”函数,则可能会出现另一个问题。您实际上想做什么?知道一个函数的大小通常不是很有意义,所以我怀疑有一个XY问题…你能详细说明为什么要这样做吗?这通常是不可能的。编译器和链接器的一个强大优化目标是使函数消失。内联优化由任何编译器实现,删除未使用的函数是常见的链接器优化。您可以通过请求链接器生成一个映射文件/map linker option来了解土地的分布情况。它将是不完整的。