摘 要
本文以一个简单的hello.c程序为例,讨论hello.c程序在linux系统上的一生。使用Linux上的各种工具,来进一步了解一个程序从生成到结束这其中所经过的过程。详细探讨了hello.c文件从变为到可执行文件程序存到硬盘开始,之后再从载入内存进程,直到程序运行完毕成为僵尸进程,最后被回收的整个完整生命历程。从而加强对计算机系统预处理、编译、汇编、链接、进程管理、存储管理、I/O管理等各环节的整体认识。
关键词:Linux;程序;编译;汇编;链接;进程管理;I/O管理
第1章 概述
1.1 Hello简介
P2P:首先,程序员在Windows或Linux环境下,利用CodeBlocks、vim等编辑器敲入C语言代码(Program),然后利用gcc编译器对C语言程序执行编译命令:hello.c文件先经过预处理器cpp,生成hello.i文件,再经过编译器ccl生成hello.s汇编程序,然后经过汇编器as生成可重定位目标程序hello.o,最后通过链接器ld链接生成可执行文件hello。在Linux终端执行./hello命令,运行该可执行文件(Process)。
O2O:当执行hello程序后,shell创建新的子进程,在其中调用execve函数将hello程序由虚拟内存加载进入物理内存,然后运行main函数,shell调用waitpid函数,当hello运行完毕成为僵尸进程后,shell就将该僵尸进程回收,同时释放虚拟内存并删除hello的相关内容,这时hello运行过的痕迹都被清空,控制权重新传回shell,等待运行下一条输入的命令,从而实现了O2O的全过程。
1.2 环境与工具
硬件:X86-64,Intel core i5
软件:windows11,linux,ubuntu20.04
开发工具:gcc,edb等。
1.3 中间结果
hello.c Hello源程序
hello.i 预处理生成文件
hello.s 汇编程序
hello.o 可重定位目标程序
hello.elf Hello.o的ELF格式可执行文件
hello 链接器生成的可执行目标文件
hello.asm Hello.o的反汇编文件
hello1.elf Hello的ELF格式可执行文件
1.4 本章小结
本章进行了hello程序一生P2P,O2O的简要概述,列出了本实验的硬件环境、软件环境、开发工具和本实验中生成的中间结果文件的名字和作用。
第2章 预处理
2.1 预处理的概念与作用
预处理的概念是:在编译之前进行的处理。C语言的预处理主要有以下三个方面的内容:1. 宏定义;2. 文件包含;3. 条件编译,预处理命令以符号#开头,如#if, #endif, #define, #include等。
预处理作用:
1.将所有的#define删除,展开所有的宏定义;
2.处理所有的预编译指令;
3.将#include包含的文件插入到预编译指令的位置;
4.添加行号信息和文件名信息;
5.删除所有的注释;
6.生成*.i文件。
2.2在Ubuntu下预处理的命令
gcc -E hello.c -o hello.i
2.3 Hello的预处理结果解析
从图中我们可以看到,hello件内容比hello.c的文件内容多得多,行数甚至达到了3000多行。这是因为hello.c在进行预处理时插入了一些#include包含的内容。比如,hello.c中第一行的#include <stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,结果就得到了另一个C程序,通常是以.i作为文件扩展名(即预处理文件)。
2.4 本章小结
本章执行了预处理指令,看了预处理后的文本文件的内容,看了预处理的方式与作用。