陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 嵌入式操作系统 陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华.

Slides:



Advertisements
Similar presentations
6 Copyright © Oracle Corporation, All rights reserved. 维护控制文件.
Advertisements

大连理工大学软件学院 嵌入式系统工程系 赖晓晨
LINUX 环境下程序开发基础 曙光用户培训课程系列 课程时间:1.5小时 更新日期:2008年3月.
Oracle数据库 Oracle 子程序.
在PHP和MYSQL中实现完美的中文显示
第3章 Linux编程环境.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Android快速开发入门 巫文杰、Android工程师 讲师的CSDN博客地址
Linux环境下程序编译 曙光信息产业(北京)有限公司.
Android开发入门 -----Android 开发“Ready go!” 主讲:李晓蕾
Linux Programming Prerequisite
Hadoop I/O By ShiChaojie.
张吉豫 GNU编译工具链使用简介 张吉豫
第二讲 搭建Java Web开发环境 主讲人:孙娜
学习前的准备工作 讲师:burning.
第八章 菜单设计 §8.1 Visual FoxPro 系统菜单 §8.2 为自己的程序添加菜单 §8.3 创建快捷菜单.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
嵌入式操作系统 陈香兰 Spring 2006 中国科学技术大学计算机系.
SVN服务器的搭建(Windows) 柳峰
管理信息结构SMI.
走进编程 程序的顺序结构(二).
辅导课程六.
网络常用常用命令 课件制作人:谢希仁.
第11章:一些著名开源软件介绍 第12章:服务安装和配置 本章教学目标: 了解当前一些应用最广泛的开源软件项目 搭建一个网站服务器
Head 编 译 吴 磊.
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
以ISI平台为例,为您演示一下如何在Endnote文献中查看该文献的References
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
YMSM D-PACK 安装手册 作成者:D-PACK维护组(YMSLx) 作成日:
VSS使用简介 王树升
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
东软集团(大连)有限公司 SVVD事业部-于忠华
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Gzip编译及调试 曹益华
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
三:基于Eclipse的集成开发环境搭建与使用
SOA – Experiment 2: Query Classification Web Service
编程作业3:网页正文抽取 (10分).
第二章 登录UNIX操作系统.
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
Web安全基础教程
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
第1章 c++概述 1.1 C++语言的简史及特点 1.2 简单的C++程序 1.3 C++语言的基本组成
Drupal Dev 我想知道:什么时候、什么变化.
Platform Builder使用介绍 WINCE系统应用开发流程说明 ACTION RDC 杨 涛 2005.Dec.3th
VB与Access数据库的连接.
姚金宇 MIT SCHEME 使用说明 姚金宇
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
项目二:HTML语言基础.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第4章 Excel电子表格制作软件 4.4 函数(一).
iSIGHT 基本培训 使用 Excel的栅栏问题
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Python 环境搭建 基于Anaconda和VSCode.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
百万行、千万行数据查询教程 老黄牛.
Presentation transcript:

陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 嵌入式操作系统 陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华

GNU开发工具链介绍 “工欲善其事, 必先利其器” --《论语》

Embedded Operating Systems 主要内容 GNU Tools简介 GNU Tools交叉开发环境及其安装 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 本地开发 vs 交叉平台开发 本地开发: 一般软件的开发属于本地开发,也就是说开发软件的系统与运行软件的系统是相同的。 交叉平台开发: 本课程所涉及到的嵌入式系统开发属于交叉平台开发,也就是说开发软件的系统与运行软件的系统不同。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 交叉开发平台 主机: 开发软件的平台,称为主机,往往是通用电脑; 目标机: 运行软件的平台,称为目标机,在这里是嵌入式系统。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 嵌入式交叉开发工具 掌握嵌入式开发工具的使用是进行嵌入式开发的前提条件之一 与主流开发工具类似,嵌入式交叉开发工具也包括 编译器,即能够把一个源程序编译生成一个可执行程序的软件 调试工具,即能够对执行程序进行源码或汇编级调试的软件 软件工程工具,用于协助多人开发或大型软件项目的管理的软件 2018/11/22 Embedded Operating Systems

Embedded Operating Systems GNU tools GNU tools和其他一些优秀的开源软件可以完全覆盖上述类型的软件开发工具。为了更好的开发嵌入式系统,需要熟悉如下一些软件 GCC Binutils—辅助GCC的主要软件 Gdb make cvs 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 一、GCC 很多人认为GCC只是一个C编译器, 其实GCC = GNU Compiler Collection 目前,GCC可以支持多种高级语言,如 C、C++ ADA Object C JAVA Fortran PASCAL 2018/11/22 Embedded Operating Systems

Embedded Operating Systems GCC下的工具 cpp — 预处理器 GNU C编译器在编译前自动使用cpp对用户程序进行预处理 gcc — 符合ISO等标准的C编译器 g++ — 基本符合ISO标准的C++编译器 gcj — GCC的java前端 gnat — GCC的GNU ADA 95前端 2018/11/22 Embedded Operating Systems

Embedded Operating Systems GNU Tools—gcc gcc是一个强大的工具集合,它包含了预处理器、编译器、汇编器、链接器等组件。它会在需要的时候调用其他组件。 输入文件的类型和传递给gcc的参数决定了gcc调用具体的哪些组件。 对于开发者,它提供的足够多的参数,可以让开发者全面控制代码的生成,这对嵌入式系统级的软件开发非常重要 2018/11/22 Embedded Operating Systems

Embedded Operating Systems gcc使用举例(1) 源程序 2018/11/22 Embedded Operating Systems

Embedded Operating Systems gcc使用举例(2) 编译和运行 编译 运行 2018/11/22 Embedded Operating Systems

Embedded Operating Systems gcc的工作过程(1) 如果使用-v选项,则可以看到许多被隐藏的信息 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 2018/11/22 Embedded Operating Systems

Embedded Operating Systems gcc的编译过程 一般情况下,c程序的编译过程为 1、预处理 2、编译成汇编代码 3、汇编成目标代码 4、链接 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 1、预处理 预处理:使用-E参数 输出文件的后缀为“.cpp” gcc –E –o gcctest.cpp gcctest.c 使用wc命令比较预处理后的文件与源文件,可以看到两个文件的差异 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 预编译 行数 单词数 字节数 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 2、编译成汇编代码 预处理文件汇编代码 1)使用-x参数说明根据指定的步骤进行工作,cpp-output指明从预处理得到的文件开始编译 2)使用-S说明生成汇编代码后停止工作 gcc –x cpp-output –S –o gcctest.s gcctest.cpp 也可以直接编译到汇编代码 gcc –S gcctest.c 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 预处理文件汇编代码 直接编译到汇编代码 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 3、编译成目标代码 汇编代码目标代码 gcc –x assembler –c gcctest.s 直接编译成目标代码 gcc –c gcctest.c 使用汇编器生成目标代码 as –o gcctest.o gcctest.s 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 汇编代码目标代码 直接编译成目标代码 使用汇编器 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 4、编译成执行代码 目标代码执行代码 gcc –o gcctest gcctest.o 直接生成执行代码 gcc –o gcctest gcctest.c 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 目标代码执行代码 直接生成执行代码 2018/11/22 Embedded Operating Systems

Embedded Operating Systems gcc的高级选项 -Wall:打开所有的警告信息 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 根据警告信息检查源程序 Main函数的返回值为int 在函数的末尾应当返回一个值 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 修改源程序 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 优化编译 优化编译选项有: -O0 缺省情况,不优化 -O1 -O2 -O3 等等 不同程度的优化 2018/11/22 Embedded Operating Systems

gcc的优化编译举例(1) 考虑如下的源代码 不同的优化 编译选项 2018/11/22 Embedded Operating Systems

gcc的优化编译举例(2) 使用time命令统计程序的运行 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 二、GNU binutils binutils是一组二进制工具程序集,是辅助GCC的主要软件,它主要包括 addr2line 把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。 ar 建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems as 是GNU汇编器,主要用来编译GNU C编译器gcc输出的汇编文件,他将汇编代码转换成二进制代码,并存放到一个object文件中,该目标文件将由连接器ld连接 C++filt解码C++符号名,连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。 gprof 显示程序调用段的各种数据。 ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并链接符号引用,最终形成一个可执行文件。通常,建立一个新编译程序的最后一步就是调用ld。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems nm 列出目标文件中的符号。 objcopy把一种目标文件中的内容复制到另一种类型的目标文件中. objdump 显示一个或者更多目标文件的信息。使用选项来控制其显示的信息。它所显示的信息通常只有编写编译工具的人才感兴趣。 ranlib 产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。 readelf 显示elf格式可执行文件的信息。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems size 列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。 strings 打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符,这个程序对于了解非文本文件的内容很有帮助。 strip 丢弃目标文件中的全部或者特定符号。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems libiberty 包含许多GNU程序都会用到的函数,这些程序有: getopt, obstack, strerror, strtol 和 strtoul. libbfd 二进制文件描述库. libopcodes 用来处理opcodes的库, 在生成一些应用程序的时候也会用到它, 比如objdump.Opcodes是文本格式可读的处理器操作指令. 2018/11/22 Embedded Operating Systems

Embedded Operating Systems binutils开发工具使用举例 ar nm Objcopy Objdump readelf 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 1、ar ar用于建立、修改、提取归档文件(archive),一个归档文件,是包含多个被包含文件的单个文件(也可以认为归档文件是一个库文件)。 被包含的原始文件的内容、权限、时间戳、所有者等属性都保存在归档文件中,并且在提取之后可以还原 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 使用ar建立库文件(1) 源程序add.c和minus.c 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 使用ar建立库文件(2) 编译成目标文件 建立库文件 Ar的rv参数的说明: r:将多个文件组成一个文件 v:输出信息 将库文件拷贝到/usr/lib目录下 2018/11/22 Embedded Operating Systems

库文件使用举例 在代码中使用Add和Minus函数 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 在编译时指定库文件 指明将libtest.a链接进来 运行结果 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 2、nm nm的主要功能是列出目标文件中的符号,这样程序员就可以定位和分析执行程序和目标文件中的符号信息和它的属性 2018/11/22 Embedded Operating Systems

Embedded Operating Systems nm显示的符号类型 A:符号的值是绝对值,并且不会被将来的链接所改变 B:符号位于未初始化数据部分(BSS段) C:符号是公共的。公共符号是未初始化的数据。在链接时,多个公共符号可能以相同的名字出现。如果符号在其他地方被定义,则该文件中的这个符号会被当作引用来处理 D:符号位于已初始化的数据部分 T:符号位于代码部分 U:符号未被定义 ?:符号类型未知,或者目标文件格式特殊 2018/11/22 Embedded Operating Systems

Embedded Operating Systems nm使用举例 如果对test可执行文件使用nm, 会有什么结果呢?(作业) 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 3、objcopy 可以将一种格式的目标文件内容进行转换,并输出为另一种格式的目标文件。 它使用GNU BFD(binary format description)库读/写目标文件,通过这个BFD库,objcopy能以一种不同于源目标文件的格式生成新的目标文件 $objcopy -h 在makefile里面用-O binary 选项来生成原始的二进制文件,即通常说的image文件 2018/11/22 Embedded Operating Systems

Embedded Operating Systems Objcopy使用举例 使用file命令查看文件类型 生成srec格式的目标文件 使用file命令查看新文件的类型 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 文件格式 a.out: assembler and link editor output 汇编器和链接编辑器的输出 coff common object file format 一种通用的对象文件格式 ELF excutive linked file Linux系统所采用的一种通用文件格式,支持动态连接。ELF格式可以比COFF格式包含更多的调试信息 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 文件格式 Flat elf格式有很大的文件头,flat文件对文件头和一些段信息做了简化 uClinux系统使用flat可执行文件格式 SREC MOTOROLA S-Recoder格式(S记录格式文件) 等等 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 4、objdump 显示一个或多个目标文件的信息,由其选项来控制显示哪些信息。 一般来说,objdump只对那些要编写编译工具的程序员有帮助,但是我们通过这个工具可以方便的查看执行文件或者库文件的信息 2018/11/22 Embedded Operating Systems

Embedded Operating Systems Objdump使用举例(1) -f选项:显示文件头中的内容 2018/11/22 Embedded Operating Systems

Embedded Operating Systems Objdump使用举例(2) -d选项进行反汇编 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 5、readelf readelf: 显示一个或多个ELF格式的目标文件信息。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems Readelf使用举例 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 三、其他GNU工具 Gdb—调试器 GNU make--软件工程工具 diff,patch--补丁工具 CVS--版本控制系统 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 1、GNU Toolchain—gdb Gdb = GNU debuger GNU tools中的调试器,功能强大 设置断点 监视、修改变量 单步执行 显示/修改寄存器的值 堆栈查看 远程调试 2018/11/22 Embedded Operating Systems

Embedded Operating Systems gdb使用举例 源代码如下 编译: gcc –o bug bug.c 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 编译并运行 编译 ???? 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 使用gdb调试bug 运行bug 输入字符串hello 显示出错位置 2018/11/22 Embedded Operating Systems 能不能看到源代码呢?

Embedded Operating Systems 使用gcc的-g参数 gcc –g –o bug bug.c 重新调试 列出源代码 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 设置断点 ?怎么修改前面的源代码呢? 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 2、使用GNU make管理项目 GNU make是一种代码维护工具,在使用GNU编译器开发大型应用时,往往要使用make管理项目。 如果不使用make管理项目,就必须重复使用多个复杂的命令行维护项目和生成目标代码。 Make通过将命令行保存到makefile中简化了编译工作。 Make的主要任务是根据makefile中定义的规则和步骤,根据各个模块的更新情况,自动完成整个软件项目的维护和代码生成工作。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems Make可以识别出makefile中哪些文件已经被修改,并且在再次编译的时候只编译这些文件,从而提高编译的效率 Make会检查文件的修改和生成时间戳,如果目标文件的修改或者生成时间戳比它的任意一个依赖文件旧,则make就执行makefile文件中描述的相应命令,以便更新目的文件 只更新那些需要更新的文件,而不重新处理那些并不过时的文件 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 特点: 适合于支持多文件构成的大中型软件项目的编译,链接,清除中间文件等管理工作 提供和识别多种默认规则,方便对大型软件项目的管理 支持对多目录的软件项目进行递归管理 对软件项目具有很好的可维护性和扩展性 2018/11/22 Embedded Operating Systems

Embedded Operating Systems makefile Makefile告诉make该做什么、怎么做 makefile主要定义了 1)依赖关系 即有关哪些文件的最新版本是依赖于哪些别的文件产生或者组成的 2)需要用什么命令来产生目标文件的最新版本 3)以及一些其他的功能 2018/11/22 Embedded Operating Systems

Embedded Operating Systems Makefile的规则 规则 一条规则包含3个方面的内容, 1)要创建的目标(文件), 2)创建目标(文件)所依赖的文件列表; 3)通过依赖文件创建目标文件的命令组 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 规则一般形式 target ... : prerequisites ... <tab>command <tab>... 例如 test:test.c;gcc –O –o test test.c 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 一个简单的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 \ 2018/11/22 Embedded Operating Systems

Embedded Operating Systems Make的工作过程 default goal 在缺省的情况下,make从makefile中的第一个目标开始执行 Make的工作过程类似一次深度优先遍历过程 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 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) 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 有点像环境变量 环境变量在make 过程中被解释成make的变量 可以被用来 贮存一个文件名列表。 贮存可执行文件名。如用变量代替编译器名。 贮存编译器FLAG 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 预定义变量 Make使用了许多预定义的变量,如 AR AS CC CXX CFLAGS CPPFLAGS 等等 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 简化后的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) 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 内部变量 $@扩展成当前规则的目的文件名 $<扩展成依赖列表中的第一个依赖文件 $^扩展成整个依赖列表(除掉了里面所有重复的文件名) 等等 不需要括号括住 例如: CC = gcc CFLAGS = -Wall -O -g foo.o : foo.c foo.h bar.h   $(CC) $(CFLAGS) -c $< -o $@ 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 隐含规则 (Implicit Rules) 内置的规则 告诉make当没有给出某些命令的时候,应该怎么办。 用户可以使用预定义的变量改变隐含规则的工作方式,如 一个C编译的具体命令将会是: $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 设定目标(Phony Targets) 设定目标 目标不是一个文件 其目的是为了让一些命令得以执行 使用PHONY显式声明设定目标 .PHONY: clean 使用设定目标实现多个目的 all: prog1 prog2 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 典型的设定目标 设定目的也可以用来描述一些其他的动作。例如,想把中间文件和可执行文件删除,可以在 makefile 里设立这样一个规则: clean: $rm *.o exec_file 前提是没有其它的规则依靠这个 'clean' 目的,它将永远不会被执行。但是,如果你明确的使用命令 'make clean' , make 会把这个目的做为它的主要目标,执行那些 rm 命令 2018/11/22 Embedded Operating Systems

Makefile中的函数 (Functions) 用来计算出要操作的文件、目标或者要执行的命令 使用方法: $(function arguments) 典型的函数 $(subst from,to,text) $(subst ee,EE,feet on the street) 相当于`fEEt on the strEEt' 2018/11/22 Embedded Operating Systems

Embedded Operating Systems $(patsubst pattern,replacement,text) $(patsubst %.c,%.o,x.c.c bar.c) 相当于`x.c.o bar.o‘ $(wildcard pattern) $(wildcard *.c) objects := $(wildcard *.o) 2018/11/22 Embedded Operating Systems

Embedded Operating Systems makefile中的条件语句 conditional-directive text-if-true endif or else text-if-false 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 四种条件语句 ifeq...else...endif ifneq…else…endif ifndef…else…endif ifndef...else…endif 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 实际项目中的makefile 找到Linux或者uClinux源代码中所有的makefile,分析它们的功能、相互关系。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 3、GNU Tools—ld ld,The GNU Linker Linux上常用的链接器 ld软件的作用是把各种目标文件(.o文件)和库文件链接在一起,并定位数据和函数地址,最终生成可执行程序 gcc可以间接的调用ld,使用gcc的-Wl参数可以传递参数给ld 使用命令:ld --help可以列出ld常用的一些选项 2018/11/22 Embedded Operating Systems

Embedded Operating Systems ld使用举例(1) 源程序 编译hello.c到hello.o 命令:gcc -c hello.c 2018/11/22 Embedded Operating Systems

Embedded Operating Systems ld使用举例(2) 链接 命令:ld –dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o hello.o –lc –o hello 运行 ./hello 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 目标文件 ld通过BFD库可以读取和操作coff、elf、a.out等各种执行文件格式的目标文件 BFD(Binary File Descriptor) 目标文件(object file) 由多个节(section)组成,常见的节有: text节保存了可执行代码, data节保存了有初值的全局标量, bss节保存了无初值的全局变量。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 使用objdump查看目标文件的信息 objdump –h hello.o 比较hello 2018/11/22 Embedded Operating Systems

链接描述文件( Linker script ) 可以使用链接描述文件控制ld的链接过程。 链接描述文件,command file 又称为链接脚本,Linker script 用来控制ld的链接过程 描述各输入文件的各节如何映射到输出文件的各节 控制输出文件中各个节或者符号的内存布局 使用的语言为: The ld command language,链接命令语言 2018/11/22 Embedded Operating Systems

Embedded Operating Systems ld命令的-T commandfile选项指定了链接描述文件名 如果不指定链接描述文件,ld就会使用一个默认的描述文件来产生执行文件 找到Linux或者uClinux中的链接描述文件并分析。 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 链接描述文件的命令 链接描述文件的命令主要包括如下几类: 设置入口点命令 处理文件的命令 处理文件格式的命令 其他 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 常用的命令 设置入口点 格式:ENTRY(symbol) 设置symbol的值为执行程序的入口点。 ld有多种方法设置执行程序的入口点,确定程序入口点的顺序如下: ld命令的-e选项指定的值 Entry(symbol)指定的值 .text节的起始地址 入口点为0 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 常用的命令 INCULDE filename 包含其他filename的链接描述文件 INPUT(file,file,…) 指定多个输入文件名 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 常用的命令 OUTPUT_FORMAT(bfdname) 指定输出文件的格式 OUTPUT_ARCH ( bfdname ) 指定目标机器体系结构,例如: OUTPUT_ARCH(arm) 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 常用的命令 MEMORY: 这个命令在用于嵌入式系统的链接描述文件中经常出现,它描述了各个内存块的起始地址和大小。格式如下: MEMORY { name [(attr)]:ORIGIN = origin,LENGTH = len … } 例如: 2018/11/22 Embedded Operating Systems

Embedded Operating Systems Memory举例 2018/11/22 Embedded Operating Systems

Embedded Operating Systems SECTIONS命令 SECTIONS 告诉ld如何把输入文件的各个节映射到输出文件的各个节中。 在一个链接描述文件中只能有一个SECTIONS命令 在SECTIONS命令中可以使用的命令有三种: 定义入口点 赋值 定义输出节 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 定义输出节 SECTIONS { ... secname : { contents } ... } 例如: 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 定位计数器 定位计数器,The Location Counter 一个特殊的ld变量,使用“.”表示 总是在SECTIONS中使用 例如: 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 一个简单例子 下面是一个简单的例子: 例中,输出文件包含text,data,bss三个节,而输入文件也只包含这3个节: SECTIONS { .=0x01000000; .text:{*(.text)}; .=0x08000000; .data:{*(.data)}; .bss:{*(.bss)}; } 2018/11/22 Embedded Operating Systems

SECTIONS举例(对应于上面的MEMORY例子) 2018/11/22 Embedded Operating Systems

Embedded Operating Systems Snapgear3.4.0,arm版linux 链接描述文件 Vmlinux:arch/$(ARCH)/kernel/vmlinux.lds 制作压缩版映像时 linux/arch/arm/boot/compressed/vmlinux.lds 制作bootp时 linux/arch/arm/boot/bootp/bootp.lds 2018/11/22 Embedded Operating Systems

Embedded Operating Systems GNU tools 交叉开发环境的安装 交叉开发环境 源代码配置安装,or 直接安装二进制工具 第一种方法比较复杂,如果有现成的二进制交叉环境,建议直接使用 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 使用源代码安装交叉开发环境 GNU tools的各个软件包相对独立, 在选择时要注意各个软件包的版本号及其依赖关系 如果全部是最新版本,也并不能保证可以配置并安装成功 在安装GNU tools交叉开发环境之前,首先必须建立本地GNU tools环境 2018/11/22 Embedded Operating Systems

一个可行的GNU tools与 Linux内核之间关系表 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 交叉开发环境的安装顺序 需要5个步骤完成整个GNU Tools的配置/编译/安装: 内核头文件配置 binutils软件包安装 Bootstrap GNU编译器(可完成基本C语言编译工作的编译器) C library的安装,一般是glibc 完整的GNU编译器安装 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 软件包安装步骤 对每个单独的软件包,一般安装过程包括下面4步 下载并解压软件包 配置软件包 编译软件包 安装软件包 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 安装现成的二进制交叉环境 下载arm-elf-tools的最新版本或合适的版本 如:arm-elf-tools-20030314.sh 地址:http://www.uclinux.org/pub/uClinux/arm-elf-tools/arm-elf-tools-20030314.sh 或者:http://ftp.snapgear.org/pub/snapgear/tools/arm-elf/arm-elf-tools-20030314.sh … 安装 在root权限下运行 sh ./arm-elf-tools-20030314.sh 这个命令会在开发主机上自动建立一个uClinux-ARM的交叉编译环境 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 安装成功? 检查一下(演示) 对 arm-elf运用shell的tab功能可以看到一系列arm-elf打头的程序,如 binutils系列、gcc、gdb等等 运行arm-elf-gcc –v 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 2018/11/22 Embedded Operating Systems

Embedded Operating Systems 作业二 根据教案中的示例,熟悉GNU工具链,回答教案中的问题。 2018/11/22 Embedded Operating Systems

Thanks! The end.