使用readelf -r 查看elf文件的时候,发现在rel.dyn表中有一个gmon_start符号(symbol)。
google了一下这个符号表示什么,就找到了这篇文章What is gmon_start symbol?
大致的意思就是说call_gmon_start函数初始化gmon profiling system,这个系统是在编译程序时加上-pg选项,程序通过gprof可以输出函数调用等信息。 gmon_start 指向 gmon初始化函数, 该函数开始记录 profiling信息并在 atexit()中注册了一个清理函数。
上面提到的函数和功能都是在glibc中实现,下面看一下glibc的源码,在sysdeps/generic/initfini.c中
static void
call_gmon_start(void)
{
extern void __gmon_start__ (void) __attribute__ ((weak)); /*weak_extern (__gmon_start__);*/
void (*gmon_start) (void) = __gmon_start__;
if (gmon_start)
gmon_start ();
}
所以gmon_start会出现在重定向符号表中。
call_gmon_start的调用是在_inti即.init段的代码中。
至于上面提到的profile系统的作用和gmon_start 函数的作用请参考C++ Profiler工具之初体验