如何找到函数的结束地址?函数的起始地址可以从函数名中获取。
我在面试中被问及:考虑到我编写的函数f()已经跨越了文本部分并开始重写相邻的部分(数据部分)。如何处理这种情况?他还补充说,我应该通过C代码来处理它,而不是查看符号映射文件并获取地址。
如何找到函数的结束地址?函数的起始地址可以从函数名中获取。
我在面试中被问及:考虑到我编写的函数f()已经跨越了文本部分并开始重写相邻的部分(数据部分)。如何处理这种情况?他还补充说,我应该通过C代码来处理它,而不是查看符号映射文件并获取地址。
使用GCC编译器,您可以使用&&
运算符(是的-不是&
)获取标签的地址。
这可以按如下方式使用:
void f(void) {
printf("Start %p End %p\n", f, &&f_end);
f_end: return;
}
C标准并不保证函数有一个确定的结束地址。
在实践中,函数不一定是一个连续的内存块,可能会重叠或者被代码优化器分散到多个内存块中。
因此,在运行时无法找到函数的结束地址。
此外,无法保证通过GetProcAddress获取的“起始地址”或者通过函数指针获取的地址与代码实际所在的位置有任何关系。
函数指针只保证如果你通过该地址调用函数,函数将被执行。它并不保证代码实际驻留在那里。它可能只是一个thunk的地址,例如。
你不能使用语言本身,C语言不为函数暴露“大小”的概念。
你可以尝试检查程序的二进制文件,并解析符号表等内容。