摘 要
本文详细介绍了一个名为Hello的程序的生命周期。通过对Hello在Linux下的预处理、编译、汇编、链接等过程的分析,揭示了一个程序一生从诞生到执行再到消亡的典型过程。通过分析程序经历的预处理、编译、汇编、链接、进程管理、IO管理、内存分配与回收等一系列复杂的流程,增进对程序运行过程和计算机内部结构的理解。。
关键词:hello;预处理;汇编;编译;链接;运行;I/O;
目 录
第1章 概述
1.1 Hello简介
hello.c程序
P2P:Program to Process
预处理 |
加入头文件,替换宏。 gcc -E Hello.c -o Hello.i |
编译 |
包含预处理,将 C 程序转换成汇编程序。 gcc -S Hello.c -o Hello.s |
汇编 |
包含预处理和编译,将汇编程序转换成可链接的二进制程序。 gcc -c Hello.c -o Hello.o |
链接 |
包含以上所有操作,将可链接的二进制程序和其它别的库链接在一起,形成可执行的程序文件。 gcc Hello.c -o Hello |
程序由一个项目变成一个进程的过程:C语言源程序hello.c在预处理器(cpp)处理下,得到hello.i,通过编译器(ccl),得到汇编程序hello.s,再通过汇编器(as),得到可重定位的目标程序hello.o,最后通过链接器(ld)得到可执行的目标程序hello。在shell中键入运行命令后,shell调用fork函数为其创建子进程。
O2O: From Zero-0 to Zero-0
程序“从无到有再到无”的过程:在经过P2P后,hello已经在进程中运行,当执行到return后看似hello已经结束,其实它变成了一个僵死进程,此时父进程会收到它正常终止的状态信号(经过调用waitpid函数捕获到其终止信号后),shell 父进程负责回收 hello 进程,内核删除相关数据结构,操作系统将最终释放该进程所占的一系列资源,hello结束,hello程序从无到有再到无的这一过程就是020。
1.2 环境与工具
硬件环境:Intel Core i7 x64CPU;16G RAM;512G SSD
软件环境:Windows 11 64位;Vmware Workstation Pro 17;Ubuntu 64位
开发工具:CodeBlocks 64位;VScode 64位;vim+gcc,edb,gdb,objdump
1.3 中间结果
hello.c:源程序文件;
hello.i:修改了的源程序;
hell