http://hi.baidu.com/heidycat/blog/item/f8fe3ba1c1026b8e46106472.html
在linux下,程序的运行过程比我想象中要复杂得多了。即便一个程序没有包含任何头文件,但在编译之后,便会发现目标文件中包含了libc库。譬如,在MIPS的体系环境中,对C程序使用动态链接库进行编译后得到相应的目标文件,对该目标文件反汇编后,会发现section:.MIPS.stubs,这个section相当于IA32体系下的.plt,跟踪了一下,那段stub是跳到libc中的,也就是说,链接器把libc也加载进来了,尽管程序员并没有在程序中包含任何的头文件。
那libc究竟在其中扮演了怎样的角色呢?暂时了解到的是:libc是在进程执行_start部分之前便已进行了初始化的工作,其作用是管理进程的内存空间。这篇文章说得比较清楚:How main() is executed on Linux。
P.S.在网上搜到这段文字,感觉颇有道理的:“内核之外,是一个用户态的系统程序库,为用户程序提供系统调用接口和一些最常用的routines,例如产生新的进程、分配和操作内存、存取文件等等。由于Linux是一个UNIX-like的操作系统内核,与之配合这个系统程序库通常是一个符合Single Unix Specifications标准的C语言库。依照惯例,这个库叫做libc。如果熟悉C语言程序开发,会认出这其实也是C程序的运行库,也就是说,所有用C语言开发的程序都必须和这个库链接。”(转自http://www.cchere.net/)