Linux内核的实质和Linux系统的一般执行过程
ELF目标文件格式
- 目标文件(ABI,应用程序二进制接口):编译器生成的文件。
- 目标文件的格式:out格式、COFF格式、PE(windows)格式、ELF(Linux)格式。
- ELF(Executable and Linkable Format)即可执行和可链接的格式,是一个目标文件格式的标准。ELF格式的文件用于存储Linux程序。其包含了以下三类:
- 可重定位文件:保存着代码和适当的数据,用来和其它的目标文件一起来创建一个可执行文件、静态库文件或者是一个共享目标文件
- 可执行文件:保存着一个用来执行的程序,一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析(除了运行时解析的共享库符号)的文件。
- 共享目标文件:保存着代码和合适的数据,用来被两个链接器链接。第一个是链接编辑器(静态链接),可以和其它的可重定位和共享目标文件来创建其它的object。第二个是动态链接器,联合一个可执行文件和其它的共享目标文件来创建一个进程映象。
- 程序从源代码到可执行文件的步骤:预处理、编译、汇编、链接
①编译器预处理:gcc -E -o XX.cpp XX.c (-m32)
②汇编器编译成汇编代码
gcc -x cpp-output -S -o hello.s hello.cpp (-m32)
③汇编代码编译成二进制目标文件
gcc -x assembler -c hello.s -o hello.o (-m32)
④链接成可执行文件
gcc -o hello.static hello.c (-m32) -static
预处理和编译完的文件均为文本文件,汇编和链接完的文件均为ELF文件。 - 可执行文件处理过程也是系统调用。
- 程序装载中fork与execve的区别和联系
- 他们都是比较特殊的系统调用
- fork在陷入内核态后有两次返回,第一次返回到原来父进程的位置继续向下执行,第二次是在子进程返回,这次会返回到ret_from_fork,之后正常返回用户态。
- execve在执行时陷入内核态,在内核中调用execve加载的可执行文件把当前进程的可执行程序给覆盖了,当其返回时,返回的已经不是原来的那个可