HIT-CSAPP大作业

本文详细阐述了一个简单的C程序hello.c在Linux环境下的完整生命周期,从源代码到预处理、编译、汇编、链接,直至生成可执行文件并在内存中运行及进程结束的过程。通过实例分析了预处理的作用,如宏展开、文件包含等,并介绍了预处理命令的使用。
摘要由CSDN通过智能技术生成

摘  要

本文以一个简单的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 本章小结

本章执行了预处理指令,看了预处理后的文本文件的内容,看了预处理的方式与作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值