chap1 Linux系统分析基础

上传人:z*** 文档编号:243074195 上传时间:2024-09-15 格式:PPTX 页数:149 大小:1.78MB
返回 下载 相关 举报
chap1 Linux系统分析基础_第1页
第1页 / 共149页
chap1 Linux系统分析基础_第2页
第2页 / 共149页
chap1 Linux系统分析基础_第3页
第3页 / 共149页
点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,#,单击此处编辑母版标题样式,第,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,内核,、,Linux,系统、,Linux,开发套件等,严格来说,,Linux,指由,Linux Torvalds,维护(及通过主要镜像网站发布)的内核,Linux,简介,5,Linux,发展史,1991,年,11,月,芬兰赫尔辛基大学的,Linus Torvalds,编写了一个,小,程序(取名为,Linux,),发布在,互联网,上,希望借,此实现一,个,操作系统“,内核,”,1993,年,一批高水平网络黑客参与,,Linux 1.0,诞生,1994,年,Linux,的,第一个商业版,Slackware,问世,1996,年,美国国家标准技术局计算机系统,实验室,确认,Linux,版本,1.2.13,符合,POSIX,标准,2001,年,Linux2.4,版内核发布,2003,年,Linux2.6,版内核,发布,Linux,简介,6,Linux,操作系统特征,符合,POSIX,标准规范的操作系统,Portable Operation System Interface of Unix,:可移植的操作系统接口,由,IEEE,开发,,ANSI,和,ISO,标准化,具备现代操作系统的基本功能,抢占式多任务处理,支持多用户,图形用户接口,异构硬件支持,支持,SMP,支持,TCP/IP,多体系结构支持,支持,32/64,位,CPU,拥有其他,操作系统没有的,特色,NFS,、,VFS,、高效,的,EXT,系列文件系统等,Linux,简介,代表一种开源文化,免费软件,开放源代码,自由软件,,,可在原有程序基础上开发自己的程序,GNU/Linux,Linux,仅指,Linux,内核,Linux,系统的大部分应用都建立在,GNU,软件之上,核心结构,Linux,内核,Linux Shell,Linux,文件系统,Linux,应用系统,GNU Tools,7,Linux,精髓,Linux,简介,8,Linux,的系统结构,用户应用程序,系统调用,硬件资源管理接口,Shell,,库函数,内核实现,Linux,简介,用户态,核心态,不区分的缺陷,用户直接修改操作系统的数据,用户直接调用操作系统的内部函数,用户直接操作外设,用户任意读,/,写物理内存,区分的意义,禁止用户程序和底层硬件直接打交道,如果用户程序往硬件控制寄存器写入不恰当的值,可能导致硬件无法正常工作,禁止用户程序访问任意物理内存,否则可能会破坏其他程序的正常执行,如果对核心内核所在的地址空间写入数据,会导致系统崩溃,9,划分用户态,/,内核态的必要性,Linux,简介,现代,CPU,都有几种不同指令执行级别,在高执行,级别状态下,,代码可以执行,特权指令,,访问,任意的物理地址,,此时,CPU,执行级别就对应着内核态,在低级别执行状态下,代码的掌控范围会受到限制,只能在对应级别允许的范围内活动,举例,intel x86 CPU,有四种不同的执行级别,03,Linux,只使用,0,级和,3,级,分别表示内核态和用户态,10,CPU,对用户态,/,和心态划分的支持,Linux,简介,CS,寄存器,最低两位,表明当前代码的特权级,CPU,每条指令的读取都是通过,cs:eip,这两个寄存器,cs,:代码段选择寄存器,eip,:偏移量寄存器,上述判断由硬件完成,在,Linux,中,地址空间是一个显著的标志,0xc0000000,以上地址空间:只能在内核态下访问,0x000000000xbfffffff,的地址空间:两种状态下都可访问,注意,这里的地址空间是逻辑地址而不是物理地址,11,用户态,/,和心态的区分方法,Linux,简介,Linux,是,单内核,、,多模块,系统,Linux,内核运行在单独的内核地址空间,所有操作系统功能作为一个模块,实现,在内核中,模块均运行在内核态,直接调用函数,无需消息传递,具备模块化设计、抢占式内核,(Linux 2.6,支持,,Linux 2.4,用户级抢占,),、支持内核线程及动态装载内核模块的能力,与,Unix,主要区别,Linux,汲取了微内核设计思想(基于模块定制内核),Unix,也是单内核系统,Windows NT,和,Mach,是,微内核,系统,只提供基础功能,其他功能,通过服务实现,微内核功能被划分为多个独立过程,每个过程称为服务器,12,Linux,的内核特点,Linux,简介,13,Linux,单内核结构,用户态,标准函数库,系统调用,(,POSIX,标准,),接口,模块,内核,(,进程管理、存储管理、文件管理、设备管理、网络管理,),设备,驱动,计算机硬件,核心态,单内核,模块,接口,驱动,接口,应用程序,Linux,简介,14,Linux,的内核版本,Linux,内核,版本指由,Linux,开发小组,(,Linus Torvalds,总协调),开发,出系统,内核的版本号,Linux,内核,采用,双,树系统,一棵是稳定树,主要用于发行,另一棵是非稳定,树(开发树),,用于产品开发和改进,Linux,内核版本号由,3,位数字,组成,r,.,x,.,y,第,1,位数字,r,为主版本号,第,2,位数字,x,为说明版本类型的次,版本号:,偶数表示产品化版本,奇数表示实验,版本,第,3,位数字,y,为修改号,表示错误修补的次数,Linux,简介,15,主流的,Linux,发行版本,Linux,简介,16,Linux与Windows的区别,文件系统,Linux,需要一个挂载,根目录,/,的,ext分区,和一个作为虚拟内存的,swap分区,Linux没有盘符,,,可通过设备名挂载,,挂在信息在/,dev/fstab,,如,mount -t ntfs /dev/sda1 /mnt/win_c,Linux,将,所有设备都映射,成,/,dev目录,下的一个文件,用户管理,系统管理员是root,使用su命令切换,Linux,简介,17,主要内容,Linux,简介,Linux,内核环境,Linux,编程环境,Linux,的系统初始化,Linux,的程序执行机制,18,Linux,内核核心组成,进程调度,程序:负责,控制进程访问,CPU,内核,管理程序:支持虚拟内存及多进程安全共享,主存,系统,虚拟,文件系统:抽象异构硬件设备细节,,提供公共文件,接口,网络,接口:提供对多种组网,标准和网络硬件的,访问,进程间通信:为进程之间,的通信,提供实现机制,Linux,内核环境,19,Linux,内核源码的获取,下载位置,www.kernel.org,以,GNU zip,和,bzip2,形式发布,安装位置,一般安装在,/usr/src/linux,,不要将该源码树用于开发,在编译自己编写的,C,库所用的内核版本要链接到该树,不要以,root,身份对内核进行修改,应先建立自己的主目录,仅以,root,身份安装新内核,安装新内核应该保持,/usr/src/linux,原封不动,Linux,内核环境,20,Linux,核心源码结构,Linux,内核环境,21,Linux,核心源码的组织,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,子目录,独立于体系结构,的主存管理文件,包括实现虚拟主存管理的源代码,Linux,内核环境,/fs,目录,存放,VFS,和系统支持的各种文件系统源代码,每个子目录对应一个特定文件系统,/include,目录,存放重要的内核,.h,头文件,为各种,CPU,专设一个子目录,通用子目录,include/linux,、,include/net,/ipc,目录,存放处理进程间通信所需源代码,22,Linux,核心源码的组织(续),Linux,内核环境,/drivers,目录,存放所有设备驱动程序源代码,/net,子目录,存放网络子系统,如各种网卡和网络规程驱动程序,/security,目录,存放安全子系统代码,/sound,目录,存放语音子系统代码,23,Linux,核心源码的组织(续),Linux,内核环境,/init,目录,存放内核引导和初始化代码,许多重要文件,如,main.c,、,version.c,就位于该目录下,/lib,目录,存放内核需要的通用工具性内核函数(如对出错信息的处理),它能够在引导时解压内核并装入主存,/scripts,目录,存放编译内核所用脚本和用于系统配置的命令文件,/documentation,目录,存放内核源代码文档,24,Linux,核心源码的组织(续),Linux,内核环境,采用,模块化,的内核配置系统,加载内核模块,(Loadable Kernel Module),的概念,模块实际上是一种目标对象文件,没有链接,不能独立运行,但是其代码可以在系统运行时链接到系统中作为内核的一部分运行,或从内核中取下,从而可以动态扩充内核的功能(不需要重新编译内核),这种目标代码通常由一组函数和数据结构组成,25,Linux,内核的配置组成,Linux,内核环境,使得内核更加紧凑和灵活,可扩展,修改模块时,不必全部重新编译整个内核,系统如果需要使用新模块,只要编译相应的模块,然后将模块插入即可,模块可以不依赖于某个固定的硬件平台,模块的目标代码一旦被链接到内核,它的作用域和静态链接的内核目标代码完全等价,26,内核模块的优点,Linux,内核环境,并不是所有地方都使用内核模块,设备驱动程序,文件系统驱动程序,系统调用,大部分系统调用属于基础内核(,Basic kernel,),也可以以内核模块方式增加新的系统调用或者覆盖现有基于内核模块方式实现的系统调用,27,内核模块的使用,Linux,内核环境,程序代码:,helloworld.c,28,内核模块示例,#include /,包含模块初始化和清理函数的定义,#include /,包含加载模块需要的函数和符号定义,/,模块许可声明,否则会提示,”kernel tainted”,警告,信息,MODILE_LICENSE,(“GPL,”),static int hello_init(void,) ,printk,(“,Hello World!n,”); /,表示消息的优先级,return,0;,static void hello_exit(void,) ,printk,(“ Goodbye!n,”);,/,以下,两个宏注册和清理函数,两者必须配对且顺序不能调换,module_init(hello_init),module_exit(hello_exit),Linux,内核环境,Makefile,文件,编译、安装方法,执行,make,命令,生成,helloworld.ko,文件,执行内核模块装入命令,insmod helloworld.ko,屏幕将显示“,Hello World,”,执行命令,lsmod,显示模块状态信息,ModuleSizeUsedby,h,elloworld4640(unused),执行内核,模块,卸载,命令,rm,mod helloworld,屏幕将显示,“,Goodbye!,”,29,内核模块示例,Linux,内核环境,TARGET = helloworld,KDIR = /usr/src/linux,/,表示源代码最高层目录的位置,PWD = $ (shell pwd),o,bj-m += $ (TARGET) .o,/,指示,kbuild,,将,$ (TARGET,),编译成内核模块,d,efault:,make C $ (KDIR) M = $ (PWD) modules,30,内核模块与应用程序的差别,C,语言程序,模块,运行,用户,空间,内核,空间,入口,main,(),module_init(),出口,无,module_exit(),编译,gcc,-c,编制专用,Makefule,,并调用,gcc,连接,gcc insmod,运行,直接,运行,insmod,调试,gdb,kdbug, kdb, kgdb,等,Linux,内核环境,控制需要编译到内核的,二进制映象,(启动时载入)和在需要时才装入的,内核模块,配置选项命名形式:,CONFIG_,FEATURE,如,CONFIG_SMP,表示支持对称多处理器,配置项选择模式,二选一:,yes,或,no,三选一:,yes,、,no,或,module,Yes,选项表示把代码编译进,主内核映象,,而不作为模块,Module,意味该配置项被选定,但编译时该功能的实现代码是,以模块形式生成,驱动程序,一般都用三选一形式,字符串或整数,不控制编译过程,只是指定内核源码可以访问的值,如定义静态变量,一般以预处理宏的形式表示,31,Linux,内核编译时的模块选配参数,Linux,内核环境,内核编译主要工具文件,内核编译后,会在,/boot,目录生产以下文件,vmlinuz,文件,i,nitrd-x.y.z.img,文件:用于临时引导,硬件到实际内核,vmlinuz,能够接管并继续引导的状态,System.map,文件,32,Linux,内核编译的基本架构,文件类型,作用,Makefile,顶层,Makefile,文件,.config,内核配置文件,arch/$(ARCH)/Makefile,机器体系相关,Makefile,文件,scripts/Makefile.*,所有内核,Makefiles,共用规则,kbuild Makefiles,其它,Makefile,文件,Makefile,定义编译链接规则、位于,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,文件都有,代码项,33,Linux,内核配置系统组成,Linux,内核环境,采用,GNU,编译工具对,.config,中的源文件列表编译,完成内核文件的配置、依赖关系及模块的生成,随后调用,Rules.make,编译文件,Rules.make,定义所有,Makefile,共用的编译规则,Makefile,支持的,make,命令,make mrproper,:检查,.o,文件及文件依赖关系的正确性,make config,:配置内核并生成配置文件,make dep,:根据配置文件创建相应的依赖关系树,make clean,:清除旧版本的目标文件,make zImage,:编译并用,gzip,压缩成,1MB,以下的内核,未压缩的文件是,vmlinuz,make bzImage,:编译并用,gzip,压缩成,1MB,以上的内核,make modules,:编译模块,make modules_install,:安装模块,depmod a,:生成模块之间的依赖关系,34,主,Makefile,功能,Linux,内核环境,准备阶段,从,www.kernel.org,下载源码并解,压到,/usr/src,目录,下,tar xvjf,linux-x.y.z.,tar.bz2,tar xvzf linux-x.y.z.tar.gz,解压位置:,linux-x.y.z,目录下,注意,:不要将内核源码解压到,/usr/src/linux,目录,该目录中的头文件是供给一些库文件使用的,建立内核编译环境(,确保子目录,asm,、,linux,和,scsi,是,指向,内核,源代码的,链接),ln sf linux-x.y.z linux,cd /usr/include,rm -rf asm linux scsi,ln -sf /usr/src/linux/include/asm-i386 asm,ln -sf /usr/src/linux/include/linux linux,ln -sf /usr/src/linux/include/scsi scsi,35,Linux,内核的编译、安装过程,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,编译模块:,make modules,安装模块:,make modules_install,生成模块依赖关系:,depmod a,安装内核:,make install,36,Linux,内核的编译、安装过程,(,续,),Linux,内核环境,配置启动文件,将内核映像拷贝到合适位置,并按启动要求启动,#cp /usr/src/linux/arch/i386/boot/zImage /boot/,vmlinuz,-x.y.z,#cp /usr/src/linux/System.map /boot/System.map-x.y.z,将,启动目录,下的,链接,文件,vmlinuz,及,System.map,指向新的内核,ln sf /boot/vmlinuz-x.y.z /boot/vmlinuz,ln sf /boot/System.map-x.y.z /boot/system.map,系统正常启动时不会读这个符号表;主要是为了内核引导出错时便于调试,/sbin/mkinitrd /boot/initrd-x.y.z.img x.y.z,如果是,LILO,启动方式,编辑,/etc/lilo.conf,37,Linux,内核的编译、安装过程,(,续,),Linux,内核环境,lilo.conf,修改方法,image=/boot/vmlinux-2.4.7-10/,旧内核,label=linux,read-only,root=/dev/hdal,image=/,boot/vmlinuz-x.y.z,/,新内核,label=newkernel,read-only,root=/dev/hdal,注意:必须,运行,lilo,命令将激活新配置。如果是,grub,,则不需要。,38,Linux,内核的编译、安装过程,(,续,),39,Linux,系统的文件系统结构,/,:文件系统结构的起始,点,/home,:用户主目录,/bin,:标准,指令和工具程序,/usr,:,系统使用文件,和指令,/usr/bin,:用户命令,和工具程序,/usr/sbin,:系统,管理员命令,/usr/lib,:,编程语言库,/,usr/doc,:,Linux,文档,/usr/man,:,在线联机帮助,手册,/usr/spool,:假脱机文件,/sbin,:管理员,开启系统的命令,/var,:,时变文件,,例如邮箱文件,/dev,:,设备文件,接口,/etc,:系统配置,文件及其它,系统文件,Linux,内核环境,40,主要内容,Linux,简介,Linux,内核环境,Linux,编程环境,GNU make,管理项目,Linux,的程序执行机制,41,Linux,系统的用户视图,文件子系统,用户,硬 件 控 制,硬 件,内核,Shell,用户,用户,用户,高级语言和实用程序,系统调用,进程,管理,子系统,进程间通信,存储管理,调度程序,设备驱动程序,字符设备,块设备,高速缓存,核外程序,Linux,编程环境,42,C,程序员的系统视图,Linux,编程环境,43,系统调用与函数库,系统调用,Linux,内核的对外,接口,用户,程序和内核之间唯一的接口,函数库,依赖于系统调用,标准,函数库建立在系统调用的上层,提供的功能比系统调用强,使用也比较,方便,静态库,(.a,文件,),动态库,/,共享库,(.,so,文件,),Linux,编程环境,44,Linux,支持的编程语言,高级,编程,语言,C/C+, Java, Fortran,ELF,二进制格式,Executable,and Linkable Format,工具接口标准委员会,(TIS),选择,ELF,体系,作为,不同,操作系统之间可移植的二进制文件格式,脚本,Shell: sh/bash, csh, ksh,Perl, Python, tcl/tk, sed, awk,Linux,编程环境,45,文件名后缀,必须被预处理的汇编代码,.S,汇编代码,.s,必须转换成预编译头文件的,C+,头文件,.H .hh,必须转换成预编译头文件的,C,/,C+,头文件,.h,无需预处理的,C+,源代码,.ii,必须被预处理的,C+,源代码,.cc .cp .cpp .CPP.c+ .C .cxx,无需预处理的,C,源代码,.i,必须被预处理的,C,源代码,.c,动态库文件,(,动态对象,),.so,静态库文件,(,归档文件,),.a,目标文件,.o,Linux,编程环境,46,集成环境,集成开发环境,IDE,Emacs/xemacs,Kdevelop,Eclipse,命令行开发环境,编辑器,vi/,vim/gvim, emacs/xemacs, pico,代码阅读器,source,navigator,,,vi/emacs,+ ctags/etags,配置工具,automake,autoconf,Linux,编程环境,47,GNU,开发,工具,GCC,GNU,C,编译器,Binutils,辅助,GCC,的主要软件,GDB,GNU,调试工具,gdb,调试命令,二进制代码工具,as, ld, ar, ldd,Make,CVS,版本控制,Linux,编程环境,48,GCC,GCC,不只是,一个,C,编译器,GCC,= GNU Compiler Collection,GCC,支持,多种,高级语言的编译,C,、,C+,ADA,Object C,JAVA,Fortran,PASCAL,Linux,编程环境,49,GCC,工具,cpp,预处理器,GNU C,编译器在编译前自动使用,cpp,对程序,进行预处理,gcc,符合,ISO,等标准的,C,编译器,g+,基本符合,ISO,标准的,C+,编译器,gcj,GCC,的,java,前端,gnat,GCC,的,GNU ADA 95,前端,Linux,编程环境,50,GNU,工具,gcc,是,一个强大的工具集合,,包含,预处理器,、,编译器,、,汇编器,、,链接器,等,组件,由输入文件类型,和,传递的,参数,决定,gcc,具体调用的组件,为开发者提供足够,多的参数,,可让开,发者全面控制代码的,生成,gcc,下的,C,程序编译过程,预处理,编译成汇编代码,汇编成目标代码,链接,Linux,编程环境,51,gcc,使用举例,源程序,Linux,编程环境,52,gcc,使用举例,编译和,运行,参数,-o,:指定目标名称(缺省,gcc,编译出来的文件是,a.out,),参数,-ansi,:关闭,GNU C,中与,ANSI C,不兼容特性,激活,ANSI C,专有特性,包括禁止,asm,,,inline,,,typeof,等关键字,以及,UNIX,vax,等预处理宏,编译,运行,Linux,编程环境,53,gcc,的工作过程,使用,-v,选项,,可看到,许多被隐藏的信息,Linux,编程环境,54,预处理,使用,-E,参数激活预处理,输出,文件的后缀为“,.cpp”,gcc E o,gcctest.cpp,gcctest.c,使用,wc,命令,比较预处理后的文件与源文件,可以看到两个文件的差异,Linux,编程环境,55,行数 单词数 字节数,预编译,wc,命令示例,Linux,编程环境,56,编译成汇编代码,预处理文件,汇编代码,使用,-x,参数说明根据指定的步骤进行工作,cpp-output,指明从预处理得到的文件开始编译,使用,-S,说明生成汇编代码后停止工作,gcc x cpp-output S o,gcctest.s,gcctest.cpp,也可以,直接编译到汇编代码,gcc S,gcctest.c,Linux,编程环境,57,编译成汇编代码,直接编译到汇编代码,Linux,编程环境,预处理文件,汇编代码,58,编译成目标代码,汇编代码,目标代码,gcc x,assembler,c,gcctest.s,-c,:只编译不链接,汇编代码,目标代码,Linux,编程环境,59,编译成目标代码,直接编译成目标代码,gcc c gcctest.c,使用,汇编器生成目标代码,as,o gcctest.o,gcctest.s,直接编译成目标代码,使用汇编器,Linux,编程环境,60,编译成执行代码,目标代码,执行代码,gcc o gcctest gcctest.o,直接生成执行代码,gcc o gcctest gcctest.c,Linux,编程环境,61,gcc,的高级选项,-Wall,:打开所有的,警告信息,Linux,编程环境,62,根据警告信息检查源程序,main,函数的返回值为,int,在函数的末尾应当返回一个值,Linux,编程环境,63,修改源程序,Linux,编程环境,64,gcc,优化,编译,优化编译选项,-O0,:缺省情况,不优化,-,O,:,优化取决于目标处理器,通常包括,线程跳转,(减少跳转次数)、,延迟退栈,(在嵌套函数调用时推迟退栈时间,直到递归结束),-,O2,:,包括,O1,级优化,调整,处理器指令执行时序,,优化处理器在等待其他指令结果或数据延迟时,可执行其他不相关指令,-O3,包括,O2,级优化,使,内嵌函数,、,循环展开,执行与特定处理器特性相关的优化,Linux,编程环境,65,gcc,优化,编译,举例,不同的优化,编译选项,Linux,编程环境,66,gcc,优化,编译举例,(续),使用,time,命令,统计程序的运行,Linux,编程环境,67,GNU,binutils,简介,是,一组,二进制工具,程序,集,addr2line,将程序,地址转换为文件名和行,号,在,命令行中,给出地址和可,执行文件名,,使用可,执行文件的调试信息,指出对应源文件,以及行,号,ar,建立,、修改、提取归档,文件,归档文件结构保证可恢复,原始文件,内容,as,GNU,汇编器,主要用来,编译,gcc,输出的汇编,文件,将,汇编代码转换,成目标代码,,,并放到一个文件,该,目标文件将由连接器,ld,连接,ld,连接器,将目标和归档文件结合起来形成可执行文件,通常,建立一个新编译程序的最后一步就是调用,ld,Linux,编程环境,68,GNU,binutils,简介(续),nm,列出,目标文件中的,符号,objcopy,将一种类型目标文件转换成另,一种类型的目标,文件,objdump,显示,一个,或更多,目标文件的,信息,使用,选项来控制其显示的,信息,ranlib,产生,归档文件索引,并将其保存到这个归档文件,中,索引列出归档,文件各成员所定义的可重分配目标,文件,readelf,显示,elf,格式可执行文件的,信息,size,列出目标文件每一段的大小以及总体的大小,Linux,编程环境,69,ar,用于,建立、修改、提取归档文件,(archive,),一,个归档,文件可包含,多,个文件,(也,可认为,归档文件是一个,库文件,),归档文件保存被包含原始,文件的内容、权限、时间戳、所有者等,属性,在提取后可被还原,Linux,编程环境,70,使用,ar,建立库,文件,源程序,add.c,和,minus.c,Linux,编程环境,71,使用,ar,建立库文件,(续),编译成目标文件,将库文件拷贝到,/usr/lib,目录下,ar,的,rv,参数的说明:,r,:将多个文件组成一个文件,v,:输出信息,Linux,编程环境,72,调用,ar,建立的库文件,代码中使用,Add,和,Minus,函数,Linux,编程环境,73,调用,ar,建立的库文件(续),在编译时指定库文件,指明将,libtest.a,链接进来,运行结果,Linux,编程环境,74,nm,列出目标文件中的,符号,程序员可定位,和分析执行,程序,/,目标,文件中的符号,信息及其属性,显示的符号类型,A,:符号的值是,绝对值,,不会,被将来的链接所改变,B,:符号位于,未,初始化数据区,(,BSS,段),C,:符号是,公共,的,公共,符号是未初始化的,数据,在,链接时,多个公共符号可能以相同的名字,出现,如果,符号在其他地方被定义,则该文件中的这个符号会被,当作未定义的引用,来处理,D,:符号位于,已初始化的,数据,部分(,data,段),T,:符号位于,代码,部分(,text,段),U,:,符号是外部的,,未,被,定义(值为,0,),?,:符号类型,未知或目标,文件格式特殊,Linux,编程环境,75,nm,使用举例,Linux,编程环境,76,objcopy,将一种格式文件生成另一种格式文件,使用,file,命令,查看文件类型,生成,srec,格式,的目标文件,使用,file,命令,查看新文件的类型,Linux,编程环境,77,Linux,的可执行文件格式,a.out,格式,(assembler and link editor output),早期,UNIX,系统使用的可执行文件格式,文件头部结构定义(,include/asm-x86/a.out.h,),现在基本被,ELF,文件格式代替,COFF,格式,(Common Object File Format),包括文件头、可选头部及一些节,(section),.text, .data,和,.bss,区段各有一个小节,还可包含其他区段,一个可选头部,对不同操作系统作特定定义,文件定义位置:,include/linux/coff.h,ELF,格式,(Executable and Linking Format),代码、链接和注释都以段存在,节点表,(Section Header Table),有一个表项与每个小节对应,文件类型:,.o,目标文件,、,.so,动态库文件,、,可执行文件,ELF,格式可以比,COFF,格式包含更多的调试信息,SREC,MOTOROLA S-Recoder,格式(,S,记录格式文件),Linux,编程环境,78,objdump,显示一个或多个目标文件的,信息,由,相应,选项控制,显示哪些,信息,可通过该工具查看执行文件或库文件的信息,objdump,对编写,编译,工具、分析代码执行机制非常有用,Linux,编程环境,79,objdump,使用,举例,-f,选项:显示文件头内容,Linux,编程环境,80,objdump,使用举例,(续),-d,选项进行反汇编,Linux,编程环境,81,readelf,显示一个或多个,ELF,格式的目标文件信息,Linux,编程环境,82,GNU gdb,gdb = GNU debuger,设置,断点,监视、修改变量,单步执行,显示,/,修改寄存器的值,查看堆栈,远程调试,Linux,编程环境,83,gdb,常用,命令,不退出,gdb,就执行,make,make,不退出,gdb,就执行,shell,命令,shell,中止正在调试的程序,kill,执行当前调试的程序,run,退,出,gdb,quit,临时显示表达式的值,print,显示表达式的值,display,打开要调试的文件,file,执行一条语句,是函数则进入函数内部,step,执行一条语句但不进入函数内部,next,列出源代码的一部分,list,设置断点,可以是行号、函数名及地址,(,以*开头,),;,tbreak,:,设置临时断点,break/tbreak,Linux,编程环境,84,gdb,使用举例,源代码如下,编译,:,gcc o bug bug.c,Linux,编程环境,85,gdb,使用举例,编译并运行,?,编译,Linux,编程环境,86,使用,gdb,调试,bug,运行,bug,输入字符串,hello,显示出错位置,能不能看到源代码呢?,Linux,编程环境,87,使用,gcc,的,-g,参数,gcc,g,o bug,bug.c,-g,:在可执行程序中包含标准调试信息,重新调试,列出源代码,Linux,编程环境,88,使用,gcc,的,-g,参数,?怎么修改前面的源代码呢?,设置断点,Linux,编程环境,89,主要内容,Linux,简介,Linux,内核环境,Linux,编程环境,GNU make,管理项目,Linux,的程序执行机制,90,GNU make,代码,维护工具,,使用,GNU,编译,开发,大型应用,时,常需要使用,make,管理,项目,避免重复,使用多个,复杂命令行,维护项目和生成,目标代码,make,通过将命令行保存,到,Makefile,中简化编译工作,make,根据,Makefile,中定义的规则,和步骤及各个,模块的更新情况,自动完成整个软件项目的维护和代码生成,工作,make,可识别,Makefile,中的被修改文件,并在再次编译的时候只编译这些文件,从而提高编译的效率,make,会检查文件的修改和生成时间戳,如果目标文件的修改或者生成时间戳比它的任意一个依赖文件旧,则,make,就执行,makefile,文件中描述的相应命令,以便更新目的文件,Linux,make,管理项目,91,GNU make,特点,适合于,支持多文件构成的大中型软件项目的,编译、链接,、,清除,中间文件等管理工作,提供和识别多种默认规则,方便对大型软件项目的管理,支持对多目录的软件项目进行递归管理,对软件项目具有很好的可维护性和扩展性,Linux,make,管理项目,92,Makefile,Makefile,被,make,读取,Makefile,主要工作,定义依赖,关系,生成目标文件所依赖的文件列表,需要用什么,命令,来产生目标文件的最新版本,定义编译、链接等相关参数,Linux,make,管理项目,93,Makefile,的规则,规则,内容,要创建的,目标,(文件),创建目标(文件)所,依赖的文件列表,通过依赖文件创建目标文件的,命令组,规则一般形式,target,. :,prerequisites,.,command,.,.,规则,依赖性,操作命令,gcc,c main.c,main.o,: main.c sum.h,tab,目标,Linux,make,管理项目,94,简单,Makefile,示例,edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o,cc -o edit main.o kbd.o command.o display.o insert.o ,search.o files.o utils.o,main.o : main.c defs.h,cc -c main.c,kbd.o : kbd.c defs.h command.h,cc -c kbd.c,command.o : command.c defs.h command.h,cc -c command.c,display.o : display.c defs.h buffer.h,cc -c display.c,insert.o : insert.c defs.h buffer.h,cc -c insert.c,search.o : search.c defs.h buffer.h,cc -c search.c,files.o : files.c defs.h buffer.h command.h,cc -c files.c,utils.o : utils.c defs.h,cc -c utils.c,clean :,rm edit main.o kbd.o command.o display.o insert.o ,search.o files.o utils.o,Linux,make,管理项目,95,make,的工作过程,缺省情况下从,Makefile,中的第一个目标开始执行,执行过程,类似一次,深度优先,遍历,sum (exe),sum.o,main.o,sum.c,sum.h,sum.h,main.c,sum: main.o sum.o,gcc o sum main.o sum.o,main.o: main.c sum.h,gcc c main.c,sum.o: sum.c sum.h,gcc c sum.c,Linux,make,管理项目,96,默认依赖规则说明,.o,依赖于相应的,.c,文件,sum: main.o sum.o,gcc o sum main.o sum.o,main.o:,main.c,sum.h,gcc c main.c,sum.o:,sum.c,sum.h,gcc c sum.c,sum: main.o sum.o,gcc o sum main.o sum.o,main.o: sum.h,gcc c main.c,sum.o: sum.h,gcc c sum.c,Linux,make,管理项目,97,Makefile,中的变量,变量功能,降低,错误,风险,简化,Makefile,贮存一个文件名列表,贮存可执行文件名,贮存编译器标志参数,变量使用示例:,objects,变量(,$(objects),),objects,= main.o kbd.o command.o,display.o insert.o search.o files.o utils.o,edit:,$(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 kbd.o command.o display.o ,insert.o,search.o files.o utils.o,edit,: $(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.h,.PHONY : clean,clean :,rm edit $(objects),Linux,make,管理项目,100,内部变量,$,:,目标,文件的完整,名称,$*,:不包含扩展名的目标文件,名称,$,:依赖列表中的,第一个依赖,文件,$+,:所有的依赖,文件,以,空格分开,并以出现的先后为序,可能包含重复的依赖,文件,$,:,整个依赖列表,(除去所有重复的文件名,),$?,:所有的依赖,文件,以,空格分开,这些依赖文件的,修改日期比目标的创建日期,晚,$%,:若目标,是归档成员,则该变量表示目标的归档成员,名,例如,如果目标,名称为,mytarget.so(image.o,),$,为,mytarget.so,$%,为,image.o,举例,CC = gccCFLAGS = -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.o,edit: $(objects),cc -o edit,$(objects),问题:,没有定义如何编译生成这些目标的规则,对名为,somefile.o,的目标文件,,make,首先找与之对应的源代码,somefile.c,,并用,gcc c somefile.c o somefile.o,编译生成目标代码,注意,若,在工作目录下有对应的,somefile.p,文件,,make,会激活,pascal,编译器,工作,可使用,预定,义变量,改变隐含规则的工作方式,如,$(,CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c,$,-o,$,Linux,make,管理项目,扩展,make,隐式规则的方法,类似于普通规则,但目标必定含有符号,%,该符号可与任何,非空字符串,匹配,为与目标中的,”%”,匹配,该规则关联的相关文件部分也必须使用,”%”,举例,%.o : %.c,make,从,somefile.c,文件为所有形为,somefile.o,的文件,somefile.o,目标,make,定义的模式规则,%.o : %.c,$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $ -o $,102,模式规则,Linux,make,管理项目,103,伪目标,PHONY,背景:编写一个规则,不产生目标文件,目标体规定,make,执行的命令(在每次,make,该目标时执行),clean:,$rm *.o exec_file,原理:由于目标体,clean,没有依赖体,,make,认为,其是最新的而不执行任何操作,,因此它将永远不会被执行,若需执行,需显式执行命令,make clean,问题:如果目录中出现,clean,文件,则规则失效,没有依赖文件,文件,clean,始终是最新的,命令永远不会执行,Linux,make,管理项目,104,伪目标,PHONY,(续),.phony,是一个特殊工作目标,用来指定一个假想的工作目标,即其后并不是一个实际文件,而且,肯定要视为未更新,使用场景,避免与同名文件冲突、改善性能,前例解决方法:,. PHONY,.PHONY: clean,clean:,$rm *.o exec_file,make,不检查是否存在有文件名与依赖体中的一个名字相匹配的文件,而,直接执行与之相应的命令,Linux,make,管理项目,PHONY,目标也可以有依赖关系,使用场景,当一个目录中有多个程序,将其放在一个,makefile,中会更方便,因为缺省目标是,makefile,中的第一个目标,通常将这个,phony,目标叫做,all,,其依赖文件为各个程序,all : prog1 prog2 prog3,.PHONY: all,prog1 : prog1.o utils.o,cc -o prog1 prog1.o utils.oprog2 : prog2.o,cc -o prog2 prog2.oprog3 : prog3.o sort.o utils.o,cc -o prog3 prog3.o sort.o utils.o,105,伪目标,PHONY,(续),Linux,make,管理项目,106,Makefile,中的,函数,计算待操作,的文件、目标,或待执行,的命令,使用方法,$(,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,),:列出当前目录下所有符合模式,pattern,格式的文件名,$(wildcard *.c),objects := $(wildcard *.o),Linux,make,管理项目,107,Makefile,中的条件语句,四种条件语句,ifeq,.else.endif,ifneq,e
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!