有没有办法获得c函数的大小?

时间:2011-11-03 09:13:30

标签: c

我想知道是否有办法在运行时在内存中获取c函数的大小。

我已经使用过此代码,但它无效:

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

int main(void)
{
    int t[10];
    char c;
    offsetof(t, p);
    p: 
    return 0;
}

4 个答案:

答案 0 :(得分:7)

答案通常是否定的。你不能。一个原因是因为函数在内存中不一定是连续的。所以他们没有“大小”。有时,编译器(即ICC)会将函数跳转到二进制文件的远程部分并跳回。

请在此处查看相关问题:

how to find function boundaries in binary code

答案 1 :(得分:3)

您将数据与代码混淆,变量t在内存地址方面与函数main无关。 t存储在堆栈中,main位于代码部分。

至于获取函数的大小,没有标准的方法来获取大小。如果你愿意编写一个反汇编程序和静态代码分析,你可能会大致了解它的大小,但即使这样也不是微不足道的,因为最后的ret指令可能不是函数的最后一条指令,比如说从循环内部返回。

您可以分析编译器/链接器输出数据(PDB,映射文件等)。

但是,为什么你需要知道?

答案 2 :(得分:1)

您可以检查反汇编。反汇编程序适用于大多数环境,编译器本身通常可以从源代码生成它们。

答案 3 :(得分:0)

我已经看过它,但我无法想象你为什么需要它。要记住的是,如果你减去两个指针,它会产生一个ptrdiff_t,如果添加到第一个指针会产生第二个指针。这适用于函数指针!那怎么样:

#include <stdio.h>

int main (void) {
    printf("main is %u bytes long\n", (unsigned) (metamain - main));
    return 0;
}

void metamain (void) {
}