好的,回答我自己的问题。这将逐步完成,并且只针对Linux(也许Mach-O)。随意添加更多的东西给你的个人答案,让他们得到upvoted(你可以得到徽章,因为它现在是CW)。
我会中途开始,并根据我的发现建立休息。本文档是使用x86_64,gcc(GCC)4.1.2编写的。
打开文件,初始化
在本节中,我们描述的程序被调用时会发生什么,从内核来看,直到程序已准备好执行。
- ELF打开。
- 内核查找.text部分并将其加载到内存中。将其标记为只读
- 内核加载.data节
- 内核加载.bss节,并将所有内容初始化为零。
- 内核将控制权移交给动态链接程序(其名称位于ELF文件的.interp节中)。动态链接器解析所有共享库调用。
- 控制转移到应用程序
程序的执行
- 功能_start被调用,作为ELF头指定它作为入口点传递以下信息,它
- 广告可执行
_start在glibc的__libc_start_main(通过PLT)调用实际主功能
- 所述的argc地址
- 所述的argv地址的礼服
- 的_init例程的地址
- 的_fini例程
- 一个函数指针为atexit对()注册的地址
- 可用的最高堆栈地址
_init被称为
- 调用call_gmon_start来初始化gmon分析。与执行没有关系。
- 电话frame_dummy,它包装__register_frame_info(eh_frame部分地址,BSS部分地址)(FIXME:这是什么功能做初始化一个BSS部分显然全局变量)
- 电话__do_global_ctors_aux,其作用是调用所有全局.ctors部分中列出的构造函数。
- 主要被称为
- 主要目的
- _fini被调用,它在原来的呼叫__do_global_dtors_aux作为.dtors部分指定运行所有的析构函数。
- 该程序退出。
这仅仅是我,还是这个问题的范围太广泛了? – mezoid 2009-07-30 02:20:21
我不认为它太宽泛,但应该是社区wiki – 2009-07-30 02:23:13
如果我没有得到足够的反馈意见,我想对它进行奖励。如果它是CW,我将无法做到。 – 2009-07-30 02:32:40