《程序员的自我修养-链接、装载和库》

第一章.温故而知新
最近电脑出了点故障,到电脑城维修,说是桥芯片坏了,刚好看到本书中关于计算机体系结构介绍北桥芯片是为了协调CPU,内存和高速图形设备之间的访问,速度非常快,而南桥芯片主要负责处理外鼠标,键盘,打印机等低速设备,并汇总到北桥芯片中.
第二章
程序从源文件到可执行文件:预处理替换和去除预处理指令如:#define, #if #endif等, 编译进行词法分析语法分析语义分析生成目标文件(linux *.o文件, windows *.obj文件),最后将目标文件链接生成可执行文件.
windows下的PE文件格式和linux下的ELF文件格式都是在COFF基础上生成的,将文件分为几个段如代码段: .text, 数据段(初始化过): .data, 未初始化数据段: .bss, 只读数据段:  .rodata
第六章.可执行文件的装载与进程
(1)检查ELF可执行文件格式的有效性, 比如魔数,程序头表中段的数量.
(2)寻找动态链接的".interp"段, 设置动态链接器路径.
(3)根据ELF可执行文件的程序头表的描述, 对ELF文件进行映射,比如代码,数据,只读数据.
(4)初始化ELF进程环境, 比如进程启动时EDX寄存器的地址应该是DT_FINI的地址.
(5)将系统调用的返回地址修改成ELF可执行文件的入口点,这个入口点取决于程序的链接方式, 对于静态链接的ELF可执行文件,这个程序入口就是ELF文件的文件头中e_entry所指的地址,对于动态链接的ELF可执行文件,程序入口点是动态连接器
当load_elf_binary()执行完毕,返回至do_execve()再返回至sys_execve()时,上面5补中已经把系统调用的返回地址改成了被装载的ELF程序的入口地址了,所以当sys_execve()系统调用从内核态返回用户态时, EIP寄存器直接跳转到了ELF程序的入口地址,于是新的程序开始执行, ELF可执行文件装载完成.
第七章.
动态库中的全局变量在加载时,在当前进程中会保存一个副本,防止不同进程进行访问时发生冲突.
原文地址:https://www.cnblogs.com/ourroad/p/3331745.html