如何在C编程中找到函数的结束地址?

时间:2012-06-18 15:04:55

标签: c

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

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

4 个答案:

答案 0 :(得分:5)

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

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

这不会给你完全结束,因为标签后面有一些结尾代码,但我认为这对于面试答案来说已经足够了。

答案 1 :(得分:2)

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

在实践中,函数不一定是单个连续的内存,但可以由代码优化器重叠或分成几个部分。

由于这个原因,没有办法在运行时找到它。

此外,无法保证从GetProcAddress获取的“起始地址”或通过获取函数的地址(对于函数指针)与代码实际位置有任何关系。

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

答案 2 :(得分:1)

您不能使用语言本身,C不会为函数公开“大小”的概念。

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

答案 3 :(得分:0)

您的编译器可能会生成程序集列表文件,您的链接器可能会生成映射文件。这些将让您了解特定功能的手动时间。不确定是否需要从C程序本身确定大小。