




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第1讲 Linux系统分析基础叶保留yebl南京大学计算机科学与技术系了解Linux发展概况了解Linux内核结构及编译方法掌握Linux基本编程方法掌握GNU编程工具理解Linux程序执行机制2教学目标3主要内容Linux简介Linux内核环境Linux编程环境GNU make管理项目Linux的程序执行机制4初识Linux类Unix(Unix-like)操作系统其他类UNIX系统包括Solaris、Mac OS等基于GPL(GNU Public License)的自由操作系统第一个版本发行于1991年主要用C语言编写,部分代码用汇编语言编写“Linux”在不同语境下的内涵不同Linux内核
2、、Linux系统、Linux开发套件等严格来说,Linux指由Linux Torvalds维护(及通过主要镜像网站发布)的内核Linux简介5Linux发展史1991年11月,芬兰赫尔辛基大学的 Linus Torvalds编写了一个小程序(取名为Linux),发布在互联网上希望借此实现一个操作系统“内核”1993年一批高水平网络黑客参与,诞生Linux 1.0 版 1994年Linux 的第一个商业版 Slackware 问世1996年美国国家标准技术局计算机系统实验室确认 Linux 版本1.2.13符合 POSIX 标准2001年Linux2.4版内核发布 2003年Linux2.6版内
3、核发布Linux简介6Linux操作系统特征符合POSIX标准规范的操作系统 Portable Operation System Interface of Unix:可移植的操作系统接口由IEEE开发,ANSI和ISO标准化具备现代操作系统的基本功能抢占式多任务处理,支持多用户图形用户接口异构硬件支持支持SMP支持TCP/IP多体系结构支持,支持32/64位CPU拥有其他操作系统没有的特色NFS、VFS、高效的EXT系列文件系统等Linux简介代表一种开源文化免费软件,开放源代码自由软件,可在原有程序基础上开发自己的程序GNU/LinuxLinux仅指Linux内核Linux系统的大部分应用都
4、建立在GNU软件之上核心结构Linux内核Linux ShellLinux文件系统Linux应用系统GNU Tools7Linux精髓Linux简介8Linux的系统结构用户应用程序系统调用硬件资源管理接口Shell,库函数内核实现Linux简介用户态核心态不区分的缺陷用户直接修改操作系统的数据用户直接调用操作系统的内部函数用户直接操作外设用户任意读/写物理内存区分的意义禁止用户程序和底层硬件直接打交道如果用户程序往硬件控制寄存器写入不恰当的值,可能导致硬件无法正常工作禁止用户程序访问任意物理内存,否则可能会破坏其他程序的正常执行如果对核心内核所在的地址空间写入数据,会导致系统崩溃9划分用户态
5、/内核态的必要性Linux简介现代CPU都有几种不同指令执行级别在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态在相应低级别执行状态下,代码的掌控范围会受到限制,只能在对应级别允许的范围内活动举例intel x86 CPU有四种不同的执行级别0-3Linux只使用0级和3级分别表示内核态和用户态10CPU对用户态/和心态划分的支持Linux简介cs寄存器最低两位表明当前代码的特权级CPU每条指令的读取都是通过cs:eip这两个寄存器cs:代码段选择寄存器eip:偏移量寄存器上述判断由硬件完成在Linux中,地址空间是一个显著的标志0 xc0000000
6、以上地址空间:只能在内核态下访问0 x00000000 0 xbfffffff的地址空间:两种状态下都可访问注意,这里的地址空间是逻辑地址而不是物理地址11用户态/和心态的区分方法Linux简介Linux是单内核、多模块系统Linux内核运行在单独的内核地址空间所有操作系统功能作为一个模块实现在其内核中模块均运行在内核态,直接调用函数,无需消息传递具备模块化设计、抢占式内核(Linux 2.6支持,Linux 2.4用户级抢占)、支持内核线程及动态装载内核模块的能力与Unix主要区别Linux汲取了微内核设计思想(基于模块定制内核)Unix也是单内核系统Windows NT和Mach是微内核系
7、统只提供基础功能,其他功能通过服务实现微内核功能被划分为多个独立过程,每个过程称为服务器12Linux的内核特点Linux简介13Linux单内核结构用户态标准函数库系统调用(POSIX标准)接口模块内核(进程管理、存储管理、文件管理、设备管理、网络管理)设备驱动计算机硬件核心态单内核模块接口驱动接口应用程序Linux简介14Linux的内核版本Linux内核版本指由Linux开发小组(Linus Torvalds总协调)开发出系统内核的版本号 Linux内核采用双树系统一棵是稳定树,主要用于发行另一棵是非稳定树(开发树),用于产品开发和改进 Linux内核版本号由3位数字组成 r.x.y第1
8、位数字r为主版本号 第2位数字x为说明版本类型的次版本号: 偶数表示产品化版本 奇数表示实验版本 第3位数字y为修改号,表示错误修补的次数 Linux简介15主流的Linux发行版本Linux简介16Linux与Windows的区别文件系统Linux需要一个挂载根目录/的ext分区和一个作为虚拟内存的swap分区Linux没有盘符,可通过设备名挂载,挂在信息在/dev/fstab,如mount -t ntfs /dev/sda1 /mnt/win_cLinux将所有设备都映射成/dev目录下的一个文件用户管理系统管理员是root,使用su命令切换Linux简介17主要内容Linux简介Linu
9、x内核环境Linux编程环境Linux的系统初始化Linux的程序执行机制18Linux内核核心组成进程调度程序:负责控制进程访问CPU内核管理程序:支持虚拟内存及多进程安全共享主存系统虚拟文件系统:抽象异构硬件设备细节,提供公共文件接口网络接口:提供对多种组网标准和网络硬件的访问进程间通信:为进程之间的通信提供实现机制Linux内核环境19Linux内核源码的获取下载位置以GNU zip和bzip2形式发布安装位置一般安装在/usr/src/linux,不要将该源码树用于开发在编译自己编写的C库所用的内核版本要链接到该树不要以root身份对内核进行修改,应先建立自己的主目录,仅以root身份
10、安装新内核安装新内核应该保持/usr/src/linux原封不动Linux内核环境20Linux核心源码结构Linux内核环境21Linux核心源码的组织arch 目录包含与体系结构相关的核心代码,相关.h文件则放在include/asm下支持的每种CPU均有相应子目录,包含boot、kernel、lib和mm等子目录/kernel目录存放大多数内核函数主要文件包括sched.c、time.c、sys.c、itimer.c、fork.c、signal.c、softirq.c、resource.c、dma.c、printk.c等/mm子目录独立于体系结构的主存管理文件包括实现虚拟主存管理的源代码
11、Linux内核环境/fs目录存放VFS和系统支持的各种文件系统源代码每个子目录对应一个特定文件系统/include目录存放重要的内核.h头文件为各种CPU专设一个子目录通用子目录include/linux、include/net/ipc目录存放处理进程间通信所需源代码22Linux核心源码的组织(续)Linux内核环境/drivers目录 存放所有设备驱动程序源代码/net子目录存放网络子系统,如各种网卡和网络规程驱动程序/security目录存放安全子系统代码/sound目录存放语音子系统代码23Linux核心源码的组织(续)Linux内核环境/init目录存放内核引导和初始化代码许多重要文
12、件,如main.c、version.c就位于该目录下/lib目录存放内核需要的通用工具性内核函数(如对出错信息的处理),它能够在引导时解压内核并装入主存/scripts目录存放编译内核所用脚本和用于系统配置的命令文件/documentation目录存放内核源代码文档24Linux核心源码的组织(续)Linux内核环境采用模块化的内核配置系统内核模块(Loadable Kernel Module)的概念模块实际上是一种目标对象文件,没有链接,不能独立运行但是其代码可以在系统运行时链接到系统中作为内核的一部分运行,或从内核中取下,从而可以动态扩充内核的功能(不需要重新编译内核)这种目标代码通常由一
13、组函数和数据结构组成25Linux内核的配置组成Linux内核环境使得内核更加紧凑和灵活,可扩展 修改模块时,不必全部重新编译整个内核系统如果需要使用新模块,只要编译相应的模块,然后将模块插入即可模块可以不依赖于某个固定的硬件平台模块的目标代码一旦被链接到内核,它的作用域和静态链接的内核目标代码完全等价26内核模块的优点Linux内核环境并不是所有地方都使用内核模块设备驱动程序文件系统驱动程序系统调用大部分系统调用属于基础内核(Basic kernel),也可以以内核模块方式增加新的系统调用或者覆盖现有基于内核模块方式实现的系统调用27内核模块的使用Linux内核环境程序代码:hellowor
14、ld.c编译、安装方法root# gcc -c helloworld.croot# insmod helloworld.oroot# lsmodroot# rmmod helloworld28模块示例#define MODULE#include int init_module(void) printk(“Hello World!n”);return 0;void cleanup_module(void) printk(“ Goodbye!n”);Linux内核环境29内核模块与应用程序的差别C语言程序 模块运行 用户空间 内核空间入口 main() init_module()出口 无 clea
15、nup_module()编译 gcc -c gcc -c -D_KERNEL_-DMODULE连接 gcc insmod运行 直接运行 insmod调试 gdb kdbug, kdb, kgdb等 Linux内核环境控制需要编译到内核的二进制映象(启动时载入)和在需要时才装入的内核模块配置选项命名形式:CONFIG_FEATURE如CONFIG_SMP表示支持对称多处理器配置项选择模式二选一:yes或no三选一:yes、no或moduleYes选项表示把代码编译进主内核映象,而不作为模块Module意味该配置项被选定,但编译时该功能的实现代码是以模块形式生成驱动程序一般都用三选一形式字符串或整
16、数不控制编译过程,只是指定内核源码可以访问的值,如定义静态变量一般以预处理宏的形式表示30Linux内核编译时的模块选配参数Linux内核环境内核编译主要工具文件内核编译后,会在/boot目录生产以下文件vmlinuz文件initrd.img文件System.map文件31Linux内核编译的基本架构文件类型作用Makefile顶层Makefile文件.config内核配置文件arch/$(ARCH)/Makefile机器体系Makefile文件scripts/Makefile.*所有内核Makefiles共用规则kbuild Makefiles其它Makefile文件Makefile定义编译
17、链接规则、位于linux源代码各目录配置文件(config.in或kconfig)提供内核的配置选择和设置配置工具文本命令行工具:make config基于ncurse的图形工具:make menuconfig基于X11的图形工具:make xconfig基于gtk+的图形工具:make gconfig创建默认配置:make defconfig配置工具输出文件.config文件:用#include包括到主Makefile中include/linux/autoconf.h:用#include包括到各个.c文件每个.c文件都有代码项32Linux内核配置系统组成Linux内核环境采用GNU编译工具
18、对.config中的源文件列表编译完成内核文件的配置、依赖关系及模块的生成,随后调用Rules.make编译文件Rules.make定义所有Makefile共用的编译规则Makefile支持的make命令make mrproper:检查.o文件及文件依赖关系的正确性make config:配置内核并生成配置文件make dep:根据配置文件创建相应的依赖关系树make clean:清除旧版本的目标文件make zImage:编译并用gzip压缩成1MB以下的内核未压缩的文件是vmlinuzmake bzImage:编译并用gzip压缩成1MB以上的内核make modules:编译模块make
19、 modules_install :安装模块depmod a:生成模块之间的依赖关系33主Makefile功能Linux内核环境准备阶段下载源码:将源码解压到/usr/src目录下tar xvjf linux-x.y.z.tar.bz2tar xvzf linux-x.y.z.tar.gz解压位置:linux-x.y.z目录下建立内核编译环境ln sf linux-x.y.z linux cd /usr/includerm -rf asm linux scsiln -sf /usr/src/linux/include/asm-i386 asmln -sf /usr/src/linux/incl
20、ude/linux linuxln -sf /usr/src/linux/include/scsi scsi34Linux内核的编译、安装过程Linux内核环境配置内核检查文件依赖关系正确性:make mrproper获取默认.config文件:cp /boot/config-uname -r .config生成配置文件:make config创建依赖关系树:make dep清除旧版本目标文件:make clean生成压缩形式内核文件:make bzImage或make zImage编译后的文件在/usr/src/linux/arch/i386/boot目录下编译、安装内核编译内核:make编
21、译模块:make modules安装模块:make modules_install生成模块依赖关系:depmod a安装内核:make install35Linux内核的编译、安装过程(续)Linux内核环境配置启动文件将内核映像拷贝到合适位置,并按启动要求启动#cp /usr/src/linux/arch/i386/boot/zImage /boot/zImage-x.y.z#cp /usr/src/linux/System.map /boot/System.map-x.y.zln sf /boot/vmlinuz-x.y.z /boot/vmlinuzln sf /boot/System.
22、map-x.y.z /boot/system.map系统正常启动时不会读这个符号表;主要是为了内核引导出错时便于调试/sbin/mkinitrd /boot/initrd-x.y.z.img x.y.z如果是LILO启动方式,编辑/etc/lilo.conf36Linux内核的编译、安装过程(续)Linux内核环境lilo.conf修改方法image=/boot/vmlinux-2.4.7-10/ 旧内核label=linuxread-onlyroot=/dev/hdalimage=/boot/zImage-x.y.z / 新内核label=newkernelread-onlyroot=/de
23、v/hdal注意:必须运行lilo命令将激活新配置。如果是grub,则不需要。37Linux内核的编译、安装过程(续)38Linux系统的文件系统结构/:文件系统结构的起始点/home:用户主目录/bin:标准指令和工具程序/usr :系统使用文件和指令/usr/bin:用户命令和工具程序/usr/sbin:系统管理员命令/usr/lib:编程语言库/usr/doc:Linux文档/usr/man:在线联机帮助手册/usr/spool:假脱机文件/sbin:管理员开启系统的命令/var:时变文件,例如邮箱文件/dev:设备文件接口/etc:系统配置文件及其它系统文件Linux内核环境39主要内
24、容Linux简介Linux内核环境Linux编程环境GNU make管理项目Linux的程序执行机制40Linux系统的用户视图文件子系统用户硬 件 控 制硬 件内核Shell用户用户用户高级语言和实用程序系统调用进程管理子系统进程间通信存储管理调度程序设备驱动程序字符设备块设备高速缓存核外程序Linux编程环境41C程序员的系统视图Linux编程环境42系统调用与函数库系统调用Linux内核的对外接口用户程序和内核之间唯一的接口函数库依赖于系统调用标准函数库建立在系统调用的上层,提供的功能比系统调用强,使用也比较方便静态库(.a文件)动态库/共享库 (.so文件)Linux编程环境43Lin
25、ux支持的编程语言高级编程语言C/C+, Java, FortranELF二进制格式Executable and Linkable Format工具接口标准委员会(TIS)选择ELF体系作为不同操作系统之间可移植的二进制文件格式脚本 Shell: sh/bash, csh, kshPerl, Python, tcl/tk, sed, awkLinux编程环境44文件名后缀必须被预处理的汇编代码.S汇编代码.s必须转换成预编译头文件的C+头文件 .H .hh必须转换成预编译头文件的C /C+头文件 .h无需预处理的C+源代码.ii必须被预处理的C+源代码.cc .cp .cpp .CPP.c+
26、.C .cxx无需预处理的C源代码.i必须被预处理的C源代码.c动态库文件(动态对象).so静态库文件(归档文件).a目标文件.oLinux编程环境45集成环境集成开发环境IDEEmacs/xemacsKdevelopEclipse命令行开发环境编辑器vi/vim/gvim, emacs/xemacs, pico代码阅读器 source navigator,vi/emacs+ ctags/etags配置工具 automake, autoconf, Linux编程环境46GNU开发工具GCCGNU C编译器Binutils辅助GCC的主要软件GDBGNU调试工具gdb调试命令二进制代码工具as,
27、 ld, ar, lddMakeCVS版本控制Linux编程环境47GCCGCC不只是一个C编译器GCC = GNU Compiler CollectionGCC支持多种高级语言的编译C、C+ADAObject CJAVAFortranPASCALLinux编程环境48GCC工具cpp 预处理器GNU C编译器在编译前自动使用cpp对程序进行预处理gcc 符合ISO等标准的C编译器g+ 基本符合ISO标准的C+编译器gcj GCC的java前端gnat GCC的GNU ADA 95前端Linux编程环境49GNU工具gcc是一个强大的工具集合,包含预处理器、编译器、汇编器、链接器等组件由输入文
28、件类型和传递的参数决定gcc具体调用的组件为开发者提供足够多的参数,可让开发者全面控制代码的生成gcc下的C程序编译过程预处理编译成汇编代码汇编成目标代码链接Linux编程环境50gcc使用举例源程序Linux编程环境51gcc使用举例编译和运行参数-o:指定目标名称(缺省gcc编译出来的文件是a.out)参数-ansi:关闭GNU C中与ANSI C不兼容特性,激活ANSI C专有特性包括禁止一些asminlinetypeof关键字,以及UNIX,vax等预处理宏编译运行Linux编程环境52gcc的工作过程使用-v选项,可看到许多被隐藏的信息Linux编程环境53预处理使用-E参数激活预处
29、理,输出文件的后缀为“.cpp”gcc E o gcctest.cpp gcctest.c使用wc命令比较预处理后的文件与源文件,可以看到两个文件的差异Linux编程环境54行数 单词数 字节数预编译wc命令示例Linux编程环境55编译成汇编代码预处理文件汇编代码使用-x参数说明根据指定的步骤进行工作cpp-output指明从预处理得到的文件开始编译使用-S说明生成汇编代码后停止工作gcc x cpp-output S o gcctest.s gcctest.cpp也可以直接编译到汇编代码gcc S gcctest.cLinux编程环境56编译成汇编代码直接编译到汇编代码Linux编程环境预
30、处理文件汇编代码57编译成目标代码汇编代码目标代码gcc x assembler c gcctest.s-c:只编译不链接汇编代码目标代码Linux编程环境58编译成目标代码直接编译成目标代码gcc c gcctest.c使用汇编器生成目标代码as o gcctest.o gcctest.s直接编译成目标代码使用汇编器Linux编程环境59编译成执行代码目标代码执行代码gcc o gcctest gcctest.o直接生成执行代码gcc o gcctest gcctest.cLinux编程环境60gcc的高级选项-Wall:打开所有的警告信息Linux编程环境61根据警告信息检查源程序main
31、函数的返回值为int在函数的末尾应当返回一个值Linux编程环境62修改源程序Linux编程环境63gcc优化编译优化编译选项-O0:缺省情况,不优化-O1:第一级优化优化取决于目标处理器通常包括线程跳转(减少跳转次数)、延迟退栈(在嵌套函数调用时推迟退栈时间,直到递归结束)-O2:包括O1级优化调整处理器指令执行时序,优化处理器在等待其他指令结果或数据延迟时可执行其他不相关指令-O3包括O2级优化使内嵌函数、循环展开执行与特定处理器特性相关的优化Linux编程环境64gcc优化编译举例不同的优化编译选项Linux编程环境65gcc优化编译举例(续)使用time命令统计程序的运行Linux编程
32、环境6667GNU binutils简介是一组二进制工具程序集addr2line将程序地址转换为文件名和行号在命令行中给出地址和可执行文件名,使用可执行文件的调试信息指出对应源文件以及行号ar建立、修改、提取归档文件归档文件结构保证可恢复原始文件内容asGNU汇编器,主要用来编译gcc输出的汇编文件将汇编代码转换成目标代码,并放到一个文件该目标文件将由连接器ld连接ld连接器,将目标和归档文件结合起来形成可执行文件通常,建立一个新编译程序的最后一步就是调用ldLinux编程环境68GNU binutils简介(续)nm列出目标文件中的符号objcopy将一种类型目标文件转换成另一种类型的目标文
33、件objdump显示一个或更多目标文件的信息使用选项来控制其显示的信息ranlib产生归档文件索引,并将其保存到这个归档文件中索引列出归档文件各成员所定义的可重分配目标文件readelf显示elf格式可执行文件的信息size列出目标文件每一段的大小以及总体的大小Linux编程环境69ar用于建立、修改、提取归档文件(archive)一个归档文件可包含多个文件(也可认为归档文件是一个库文件)归档文件保存被包含原始文件的内容、权限、时间戳、所有者等属性,在提取后可被还原Linux编程环境70使用ar建立库文件源程序add.c和minus.cLinux编程环境71使用ar建立库文件(续)编译成目标文
34、件将库文件拷贝到/usr/lib目录下ar的rv参数的说明: r:将多个文件组成一个文件 v:输出信息Linux编程环境72调用ar建立的库文件代码中使用Add和Minus函数Linux编程环境73调用ar建立的库文件(续)在编译时指定库文件指明将libtest.a链接进来运行结果Linux编程环境74nm列出目标文件中的符号程序员可定位和分析执行程序/目标文件中的符号信息及其属性显示的符号类型A:符号的值是绝对值,不会被将来的链接所改变B:符号位于未初始化数据部分(BSS段)C:符号是公共的公共符号是未初始化的数据在链接时,多个公共符号可能以相同的名字出现如果符号在其他地方被定义,则该文件中
35、的这个符号会被当作引用来处理D:符号位于已初始化的数据部分(data段)T:符号位于代码部分(text段)U:符号未被定义?:符号类型未知或目标文件格式特殊Linux编程环境75nm使用举例Linux编程环境76objcopy将一种格式文件生成另一种格式文件使用file命令查看文件类型生成srec格式的目标文件使用file命令查看新文件的类型Linux编程环境77Linux的可执行文件格式a.out格式(assembler and link editor output)早期UNIX系统使用的可执行文件格式文件头部结构定义(include/asm-x86/a.out.h)现在基本被ELF文件格式
36、代替COFF格式(Common Object File Format)包括文件头、可选头部及一些节(section).text, .data和.bss区段各有一个小节,还可包含其他区段一个可选头部,对不同操作系统作特定定义文件定义位置:include/linux/coff.hELF格式(Executable and Linking Format)代码、链接和注释都以段存在,节点表(Section Header Table)有一个表项与每个小节对应文件类型:.o目标文件、.so动态库文件、可执行文件ELF格式可以比COFF格式包含更多的调试信息 SRECMOTOROLA S-Recoder格式(
37、S记录格式文件)Linux编程环境78objdump显示一个或多个目标文件的信息由相应选项控制显示哪些信息可通过该工具查看执行文件或库文件的信息objdump对编写编译工具、分析代码执行机制非常有用Linux编程环境79objdump使用举例-f选项:显示文件头内容Linux编程环境80objdump使用举例(续)-d选项进行反汇编Linux编程环境81readelf显示一个或多个ELF格式的目标文件信息Linux编程环境82GNU gdbgdb = GNU debuger设置断点监视、修改变量单步执行显示/修改寄存器的值查看堆栈远程调试Linux编程环境83gdb常用命令不退出gdb就执行m
38、akemake不退出gdb就执行shell命令shell中止正在调试的程序kill执行当前调试的程序run退出gdbquit临时显示表达式的值print显示表达式的值display打开要调试的文件file执行一条语句,是函数则进入函数内部step执行一条语句但不进入函数内部next列出源代码的一部分list设置断点,可以是行号、函数名及地址(以*开头) ;tbreak: 设置临时断点break/tbreakLinux编程环境84gdb使用举例源代码如下编译:gcc o bug bug.cLinux编程环境85gdb使用举例编译并运行?编译Linux编程环境86使用gdb调试bug运行bug输入
39、字符串hello显示出错位置能不能看到源代码呢?Linux编程环境87使用gcc的-g参数gcc g o bug bug.c-g:在可执行程序中包含标准调试信息重新调试列出源代码Linux编程环境88使用gcc的-g参数?怎么修改前面的源代码呢?设置断点Linux编程环境89主要内容Linux简介Linux内核环境Linux编程环境GNU make管理项目Linux的程序执行机制90GNU make代码维护工具,使用GNU编译开发大型应用时常需要使用make管理项目避免重复使用多个复杂命令行维护项目和生成目标代码make通过将命令行保存到Makefile中简化编译工作make根据Makefil
40、e中定义的规则和步骤及各个模块的更新情况,自动完成整个软件项目的维护和代码生成工作make可识别Makefile中的被修改文件,并在再次编译的时候只编译这些文件,从而提高编译的效率make会检查文件的修改和生成时间戳如果目标文件的修改或者生成时间戳比它的任意一个依赖文件旧,则make就执行makefile文件中描述的相应命令,以便更新目的文件Linux make管理项目91GNU make特点适合于支持多文件构成的大中型软件项目的编译、链接、清除中间文件等管理工作提供和识别多种默认规则,方便对大型软件项目的管理支持对多目录的软件项目进行递归管理对软件项目具有很好的可维护性和扩展性Linux m
41、ake管理项目92MakefileMakefile被make读取Makefile主要工作定义依赖关系生成目标文件所依赖的文件列表需要用什么命令来产生目标文件的最新版本定义编译、链接等相关参数Linux make管理项目93Makefile的规则规则内容要创建的目标(文件)创建目标(文件)所依赖的文件列表通过依赖文件创建目标文件的命令组规则一般形式target . : prerequisites . command . . 规则依赖性操作命令gcc c main.c main.o: main.c sum.htab目标Linux make管理项目94简单Makefile示例edit : main.
42、o kbd.o command.o display.o insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffe
43、r.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : search.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean : rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.oLinux mak
44、e管理项目95make的工作过程缺省情况下从Makefile中的第一个目标开始执行执行过程类似一次深度优先遍历sum (exe)sum.omain.osum.csum.hsum.hmain.csum: main.o sum.ogcc o sum main.o sum.omain.o: main.c sum.hgcc c main.c sum.o: sum.c sum.hgcc c sum.c Linux make管理项目96默认依赖规则说明.o依赖于相应的.c文件sum: main.o sum.ogcc o sum main.o sum.omain.o: main.c sum.hgcc c m
45、ain.c sum.o: sum.c sum.hgcc c sum.c sum: main.o sum.ogcc o sum main.o sum.omain.o: sum.hgcc c main.c sum.o: sum.hgcc c sum.cLinux make管理项目97Makefile中的变量变量功能降低错误风险,简化Makefile贮存一个文件名列表贮存可执行文件名贮存编译器标志参数变量使用示例:objects变量($(objects))objects = main.o kbd.o command.o display.o insert.o search.o files.o util
46、s.oedit: $(objects)cc -o edit $(objects) Linux make管理项目98预定义变量make可直接使用许多预定义的变量AR:归档维护程序的名称,默认值为 ar ARFLAGS:归档维护程序的选项AS:汇编程序的名称,默认值为 as ASFLAGS:汇编程序的选项 CC:C 编译器的名称,默认值为 cc CFLAGS:C 编译器的选项CXX:C+ 编译器的名称,默认值为 g+CPPFLAGS:C 预编译的选项 系统环境变量的处理make 过程中被解释成make变量Linux make管理项目99简化后Makefile文件objects = main.o k
47、bd.o command.o display.o insert.o search.o files.o utils.oedit : $(objects) cc -o edit $(objects)main.o : defs.h kbd.o : defs.h command.h command.o : defs.h command.h display.o : defs.h buffer.h insert.o : defs.h buffer.h search.o : defs.h buffer.h files.o : defs.h buffer.h command.h utils.o : defs.
48、h .PHONY : clean clean : rm edit $(objects) Linux make管理项目100内部变量$:目标文件的完整名称$*:不包含扩展名的目标文件名称$:依赖列表中的第一个依赖文件$+:所有的依赖文件以空格分开,并以出现的先后为序,可能包含重复的依赖文件$:整个依赖列表(除去所有重复的文件名) $? :所有的依赖文件以空格分开,这些依赖文件的修改日期比目标的创建日期晚 $%:若目标是归档成员,则该变量表示目标的归档成员名例如,如果目标名称为 mytarget.so(image.o) $ 为 mytarget.so $% 为 image.o举例CC = gccC
49、FLAGS = -Wall -O -g foo.o : foo.c foo.h bar.h$(CC) $(CFLAGS) -c $ -o $Linux make管理项目101隐式规则 (Implicit Rules)也称预定义规则告诉make在没有给出某些命令的时候如何处理举例objects = main.o kbd.o command.o utils.oedit: $(objects)cc -o edit $(objects) 问题:没有定义如何编译生成这些目标的规则对名为somefile.o的目标文件,make首先找与之对应的源代码somefile.c,并用gcc c somefile.c
50、 o somefile.o编译生成目标代码注意若在工作目录下有对应的somefile.p文件,make会激活pascal编译器工作可使用预定义变量改变隐含规则的工作方式,如$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $ -o $Linux make管理项目102扩展make隐式规则的方法类似于普通规则,但目标必定含有符号%该符号可与任何非空字符串匹配为与目标中的”%”匹配,该规则关联的相关文件部分也必须使用”%”举例%.o : %.cmake从somefile.c文件为所有形为somefile.o的文件somefile.o目标make定义的模式规
51、则%.o : %.c $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $ -o $103模式规则Linux make管理项目104伪目标PHONY不对应于实际的文件,目标体规定make执行的命令clean:$rm *.o exec_file由于目标体clean没有依赖体,make认为其是最新的而不执行任何操作,因此它将永远不会被执行若需执行,需显式执行命令 make clean解决方法:. PHONYPHONY的依赖体文件的含义与通常一样make不检查是否存在有文件名与依赖体中的一个名字相匹配的文件,而直接执行与之相应的命令.PHONY: clean
52、clean:$rm *.o exec_fileLinux make管理项目PHONY目标也可以有依赖关系当一个目录中有多个程序,将其放在一个makefile 中会更方便因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做all,其依赖文件为各个程序all : prog1 prog2 prog3.PHONY: allprog1 : prog1.o utils.occ -o prog1 prog1.o utils.oprog2 : prog2.occ -o prog2 prog2.oprog3 : prog3.o sort.o utils.occ -o prog3 pro
53、g3.o sort.o utils.o105伪目标PHONY(续)Linux make管理项目106Makefile中的函数计算待操作的文件、目标或待执行的命令使用方法$(function arguments)典型函数$(subst from, to, text) :替换字符串$(subst ee, EE, feet on the street) 相当于fEEt on the strEEt$(patsubst pattern, replacement, text)$(patsubst %.c,%.o, x.c.c bar.c) 相当于x.c.o bar.o $(wildcard pattern
54、) :列出当前目录下所有符合模式pattern格式的文件名$(wildcard *.c)objects := $(wildcard *.o) Linux make管理项目107Makefile中的条件语句四种条件语句ifeq.else.endififneqelseendififdefelseendif ifndef.elseendif conditional-directive text-if-trueendif或conditional-directive text-if-trueelse text-if-falseendifLinux make管理项目108带条件的makefile举例sum
55、: main.o sum.ogcc o sum main.o sum.omain.o: main.c sum.hgcc c main.c #deciding which file to compile to create sum.oifeq ($(USE_SUM), 1) sum.o: sum1.c sum.h gcc c sum1.c o $else sum.o: sum2.c sum.h gcc c sum2.c o $endif Linux make管理项目109可移植GNU 包的典型安装方法下载源代码包foo-1.0.tar.gztar xvzf foo-1.0.tar.gzcd fo
56、o-1.0./configuremake(su) make install问题1:配置脚configure是如何生成的?问题2:configure脚本怎么知道该如何生成Makefile?幕后英雄:GNU Auto 工具autoconf, automake, libtool, autoscan, autoheaderLinux make管理项目110autoconf框架图autoscanconfigure.scanconfigure.inMakefile.amMakefile.inMakefileautomakeeditaclocal.m4aclocalconfigureautoconfSrc
57、codeautoscan./configureLinux make管理项目autoheader为软件包创建configure. scan文件从源文件中抽取与函数调用和头文件相关的信息,并为相应包创建一个 configure.scan文件(configure.in前身)autoscan在以命令行参数中指定的目录为根(如果未给定参数,则以当前目录为根)的目录树中检查源文件基于perl语言实现111autoconf流程 autoscanautoscanconfigure.scanconfigure.inMakefile.amMakefile.inMakefileautomakeeditaclocal
58、.m4aclocalconfigureautoconfSrc codeeditautoscan./configureLinux make管理项目autoheaderconfigure.scan示例112autoconf流程 autoscan(续)AC_PREREQ(2.64) /表明文件所需要的autoscan版本#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)AC_INIT(hello, 1.0, user) #侦测所指定源代码文件是否存在,来确定源代码目录的有效性AC_CONFIG_SRCDIR(helloworld.c) #
59、用来生成config.h文件,以便autoheader使用AC_CONFIG_HEADERS(config.h) #指定编译器,如果不指定,选用默认gcc AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile )Linux make管理项目编辑configure.scan,生成configure.
60、in由configure.scan文件更名而来是configure脚本的输入文件解决在不同unix变种之间移植程序的问题库名可能不同应用程序名可能不同结构和常量的定义可能不同configure脚本完成autoconf与automake的初始化工作为不同的平台定义相应的宏检测并指定适当的程序名、库名、结构和常量名等指定要为哪些目录输出Makefile文件113autoconf流程 editLinux make管理项目114autoconf流程 editconfiugre.in文件的一般布局AC_INIT测试程序测试函数库测试头文件测试类型定义测试结构测试编译器特性测试库函数测试系统调用AC_OU
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科技企业如何应对负面网络舆情
- 电子商务背景下的现代物流管理创新
- 科技企业战略投资与管理案例
- 纵膈肿瘤中医护理方案
- 科技发展与办公效率的飞跃提升
- 科技医疗与视觉健康激光眼手术的术后保养
- 电子商务行业的市场预测与战略规划
- 木地板防水工程施工方案
- 天津商业大学宝德学院《安装工程计量与计价》2023-2024学年第二学期期末试卷
- 厦门海洋职业技术学院《体育-台球》2023-2024学年第二学期期末试卷
- 上海市建设工程施工图设计文件勘察设计质量疑难问题汇编(2024 版)
- 《康复工程学》课件-第一讲 康复工程概论
- 2025年度智慧医疗服务平台建设合同范本
- 2024项目管理人员安全培训考试题(审定)
- 2025四川宜宾市高县县属国企业第一次招聘3人易考易错模拟试题(共500题)试卷后附参考答案
- 2024 年国家公务员考试《申论》(地市级)真题及答案
- 南京2025年中国医学科学院皮肤病医院招聘13人第二批笔试历年典型考点(频考版试卷)附带答案详解
- 2024年沈阳职业技术学院高职单招语文历年参考题库含答案解析
- 《榜样9》观后感心得体会一
- 2024年上海普陀区司法局招聘人民调解员考试真题
- 驾照考试题库及答案(完整版)
评论
0/150
提交评论