嵌入式Linux上的C语言编程实践--第1章-Linux环境下C语言的开发

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第1章Linux环境下C语言的开发在我村的正南面,有一条六十年代人工挖成的子牙新河。子牙新河弯弯曲曲,像一条欢跃飞腾的巨龙。两岸高大的垂柳,在风中用力甩开长长的枝条,奏响动人的乐曲,令人陶醉。三十年前,子牙新河水清见底,连鱼的游动都能看得清清楚楚。有时河水暴涨,水溢出河床,甚至从家中就能听到水的欢叫声。每当这时,我便跑到桥上,看河水咆哮着滚滚东去,心胸顿觉开阔,心情顿感舒畅。“河水清澈鱼儿肥,煮鱼香味满天飞。人人夸我是能手,捕鱼多得如山堆……”这是当时唱响在我们村美丽动听的歌谣。由于河水充足,鱼儿又多,又肥,村里的大人和孩子们经常下河捕鱼。1981年,我师范毕业后等待分配。这期间,大哥常带上我去子牙新河捕鱼。我大哥原是天津轧钢厂的一名电工,六十年代初,大哥在天津又当上了一名交通警察。父亲为了让大哥守在身边,执意让大哥回了老家。回老家后,大哥便在我们村当了电工。大哥捕鱼很有经验,他说水涨前鱼最多。我和大哥经常拿着丝挂子(长形网,有长有短,网孔有大有小,用来粘鱼)去捕鱼,每次都会捕到许多鱼。有一次,子牙新河河水暴涨,水流很急。湍急的流水将桥西北岸冲了两个大缺口,河水在缺口里打着旋涡发出骇人的声21.1Linux下的C语言开发环境Linux和C语言有很深的渊源,因为Linux本身就是用C语言编写的,C语言是因Unix而生的,而Linux与Unix完全兼容。在Linux操作系统中提供了C语言的开发环境:程序生成工具:GCC程序调试工具:GDB工程管理工具:make命令和Makefile文件1.程序生成工具-GCCGCC是(GNUCompilerCollection)GNU编译器工具集的简称。GCC提供了编译器、汇编器、连接器以及一系列辅助工具GCC可以用于生成Linux中的应用程序,也可以用于编译Linux内核和内核模块,是Linux中C语言开发的核心工具。2.程序调试工具-GDBGDB是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操作系统中,应用程序的生成主要哪几个主要步骤?

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功