Linux 程序符号__gmon_start__

使用readelf -r 查看elf文件的时候,发现在rel.dyn表中有一个gmon_start符号(symbol)。

Screenshot from 2016-07-18 16-55-00.png

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工具之初体验

你可能感兴趣的:(Linux 程序符号__gmon_start__)