如何在 C 程序中查找函数的结束地址



可以从函数名称中获取起始地址,如何找到函数的结束地址?我在采访中被问到这个问题:

考虑我编写的函数 f() 已经越过文本部分并开始写入相邻部分(数据部分)。我该如何处理这种情况?他还补充说,我应该通过C代码来处理它。我不应该看到符号映射文件并获取地址。

使用 GCC,您可以使用 && 运算符获取标签的地址(是 - && ,而不是 & )。
这可以按如下方式使用:

void f(void) {
    printf("Start %p End %pn", f, &&f_end);
    f_end: return;
}

这不会给你确切的结尾,因为标签后面有一些尾声代码,但我认为这对于采访答案来说已经足够了。

C 标准不保证存在函数的结束地址这样的东西。

实际上,函数不一定是单个连续的内存片段,但可以重叠,或者通过代码优化器在多个片段中分段。

因此,无法在运行时找到这一点。

此外,不能保证您从 GetProcAddress 或通过获取函数地址(对于函数指针)获得的"开始地址"与代码的实际位置有任何关系。

函数指针所保证的只是,如果您通过地址调用该地址,函数将被执行。它不保证代码实际驻留在那里。例如,它可能只是一个笨蛋的地址。

你不能使用语言本身,C 没有公开函数的"大小"概念。

您可以做的是检查程序的二进制文件,并解析符号表等。

编译器可能生成程序集列表文件,链接器可能生成映射文件。 这些可以让您查看特定功能手动的长度。 不确定是否需要从 C 程序本身中确定大小。

最新更新