编译的过程:

预处理:替换宏

编译:将源代码编译成汇编

汇编:将汇编代码编译成二进制

链接:地址,so


编译成的ELF文件内容:

header信息 magic数

代码段 数据段 bss零值数据段


运行时:strace可以追踪程序的系统调用

加载ld.so

加载glibc.so

mmap将二进制映射到内存

执行main函数


glibc封装了系统调用,实现上基本是宏定义的汇编代码。因此用户并不需要关心自己写的代码是用户态还是内核态。系统调用的名字和参数通过寄存器传递。