1第1章Linux环境下C语言的开发21.1Linux下的C语言开发环境Linux和C语言有很深的渊源,因为Linux本身就是用C语言编写的,C语言是因Unix而生的,而Linux与Unix完全兼容。在Linux操作系统中提供了C语言的开发环境:程序生成工具:GCC程序调试工具:GDB工程管理工具:make命令和Makefile文件1.程序生成工具-GCCGCC是(GNUCompilerCollection)GNU编译器工具集的简称。GCC提供了编译器、汇编器、连接器以及一系列辅助工具GCC可以用于生成Linux中的应用程序,也可以用于编译Linux内核和内核模块,是Linux中C语言开发的核心工具。2.程序调试工具-GDBGDB是Linux中一个强大的命令行调试工具。在GDB中可以设置断点、单步运行、查看变量等:1、启动程序,可以按照用户的要求随心所欲的运行程序。2、可让被调试的程序在用户所指定的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。4、可以动态的改变程序的执行环境。3.工程管理工具-make和Makefile在Linux系统下的C程序开发中,常使用make命令和Makefile文件作为工程管理工具。make是Linux下的一款程序自动维护工具,配合makefile的使用,就能够统筹管理工程中的各个文件,并在编译过程中根据时间戳,有选择地进行编译,减少程序生成时间。Makefile用于描述工程中模块之间的相互依赖关系,以及产生目标文件所要执行的命令。当make命令运行时,会读取makefile来确定要建立的目标文件或其他文件,然后对源文件的日期和时间进行比较,从而决定使用那些规则来创建目标文件。1.2在Linux中使用C语言开发在Linux操作系统中,应用程序的生成主要包括以下几个步骤:编辑编译汇编连接调试运行1.2.1开发流程和开发工具Linux开发环境C语言源程序、头文件等文本文件各种编译配置脚本文本编辑工具Makefile文件GCC工具GDB工具生成目标文件、库文件、可执行文件等二进制文件编辑分析运行中调试编辑调用图1.1Linux中C语言程序的开发流程1.2.1开发流程和开发工具编译编译是指把高级语言编写的程序转换成相应处理器的汇编语言程序的过程。其本质是一个文本转换过程。编译过程:C语言的语法解析汇编语言代码的生成1.2.1开发流程和开发工具汇编汇编是指把汇编语言源程序翻译成目标系统的二进制代码(机器代码)的过程。每个源文件汇编后将生成一个目标文件。连接连接是指将汇编生成的多段机器代码组合成一个可执行程序。连接器的作用:将编译和汇编过程生成的目标文件中的代码段、数据段等部分进行合并,并添加相应的文件头。调试调试是程序开发中一个很重要的环节。在Linux程序开发中,最主要的调试工程就是GDB源文件源文件二进制目标文件编译/汇编可执行程序连接源文件源文件二进制目标文件二进制目标文件二进制目标文件调试1.2.1开发流程和开发工具Linux下程序的开发过程及相关工具的使用如图1-2所示。文本编辑工具(VI,Emacs等)C代码(.c)编译器(gcc)汇编代码(.s)汇编器(as)目标代码(.o)连接器(ld)目标代码(.o)可执行程序调试器(gdb)辅助工具(ar,nm,stings,objcopy,objdump,strip,readelf)其他目标代码...图1-2Linux程序开发过程及相关工具1.2.2Linux中程序的运行原理应用程序库函数系统调用操作系统系统调用:Linux为应用程序提供的一系列接口。库函数:编译系统提供给应用程序调用的一系列接口。C库函数调用系统调用实现相应功能C语言应用程序调用C库函数或直接调用系统调用图1.3Linux下C语言程序的结构1.2.2Linux中程序的运行原理C语言源程序文件经过编译-汇编-连接,便可生成可执行程序。可执行程序的组成程序头:包含供OS加载的信息,OS根据这些信息加载可执行程序。程序主体(二进制机器代码):程序运行时逐条执行这些机器代码,完成程序功能。1.2.2Linux中程序的运行原理可执行程序格式在Linux中,普遍使用ELF格式来作为可执行程序的格式或程序生成过程中的中间文件格式。ELF格式:ELF(ExecutableandLinkingFormat,可执行连接格式)是UNIX系统实验室作为应用程序二进制接口而开发和发布的。ELF文件格式包括三种主要的类型:可执行文件可重定位文件共享库1.2.2Linux中程序的运行原理可执行文件(应用程序)包含了适合于执行的一个程序的代码和数据可以直接运行可重定位文件(*.o)又称为目标文件包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。不能直接运行共享文件(*.so)也称动态库文件包含了在连接时被连接器ld和运行时被加载器使用的代码和数据1.2.2Linux中程序的运行原理ELF格式的文件既要参与程序的连接(创建一个程序时),又要参与程序的执行(运行程序时)为了方便和效率,ELF格式目标文件提供了两种并行视图,分别反映了连接和执行的不同需求。从连接器(Linker)角度看,是一些节的集合从程序加载器(Loader)的角度看,是一些段的集合ELF格式的程序和共享库具有相同的结构,只是段的集合和节的集合上有些不同链接器看到的是由节(Section)头部表描述的一系列逻辑节的集合(也就是说它忽略了程序头部表)。加载器则是把ELF格式的文件看成是由程序头部表描述的一系列的段的集合(忽略了区段头部表)。ELF格式的共享库可以加载到任何地址。这是因为,共享库使用PIC(PlaceIndependenceCode,位置无关代码),使得文件的代码段(Text)不需要重定位,并且可以被多个进程共享。1.2.2Linux中程序的运行原理ELF文件格式如图1-4所示:ELF头Programheadertable程序头部表(可选)Section1(节1)……Sectionn(节n)……Sectionheadertable(节头部表)ELF头Programheadertable程序头部表Segment1(节1)……Segmentn(节n)Sectionheadertable(节头部表可选)从连接器角度看从加载器角度看头部包含描述整个文件的组织节区包含连接视图的大量信息:指令、数据、符号表、重定位信息等告诉系统如何创建进程映像,可重定位文件不需要这个表。包含描述文件节区的信息,用于链接的目标文件必须包含节区头部表作业1.解释术语:编译;汇编;连接2.C语言源程序文件经过、、,便可生成可执行程序。3.在Linux中,普遍使用格式来作为可执行程序的格式或程序生成过程中的中间文件格式。4.在Linux系统下的C程序开发中,常使用命令和文件作为工程管理工具。5.在Linux操作系统中,应用程序的生成主要哪几个主要步骤?