GCC由来
是由GNU组织编写,对抗商业收费的软件
GCC编译工具链
C语言整个编译过程可以分为四个阶段
- 预处理阶段、编译阶段——GCC编译器
- 汇编阶段、链接阶段——binutils工具链
运行helloWord
gcc helloword.c -o hello
- hello.c 的文件执行变为hello.i的文件(hello.c预处理之后的文件,头文件包含,条件编译、宏定义等)
- hello.i编译成hello.s的文件(hello.s是汇编文件。通过词法分析、语法分析就能编译成汇编文件了)
- hello.s 生成重定位文件hello.o
- hello.o文件链接成一个应用程序(hello应用程序)
- 在控制台通过./hello这个shell脚本就能执行这个程序了
shell脚本怎么执行helloWord程序呢: - shell创建一个进程fork()
- 运行execev(),可以理解成这是一个进程实体
- 然后在去调用sys_execve(),这是一个系统函数
- 继续调用load_elf_binary(),它会去文件系统里边加载hello应用程序到内存,准备去执行应用程序
- 执行应用程序需要链接一些库文件 ,静态链接和动态链接。
- 静态链接:在编译阶段就会把所有用到的库全部打包到自己的一个可执行文件里,优点是移植性强,不需要依赖外部环境,但是生成的程序也会比较大
- 动态链接:在编译阶段不会把所有库都打包到可执行程序里,在程序运行的时候通过动态连接器加载库文件,完成库文件和程序的链接、 - 链接完成之后找到程序入口_start
- 然后执行_libc_start_main()用来初始化一些应用程序的执行环境
- 然后才是改执行main()函数
- 打印helloWord
- 调用glibc库调用_exit()函数结束程序运行