2011chapter05--嵌入式软件的交叉编译
- 格式:pdf
- 大小:130.00 KB
- 文档页数:23
Mips GNU工具链简介1 . 总括本文分三部分来介绍mips的工具链,首先工具链的总括,其次是每个工具链的简介,最后是各工具链的实际应用举例。
我们的项目使用的工具链就如图1所示, 声明,本文所述的内容实乃GNU工具链的九牛之一毛, 日后会陆续更新。
图12. 工具链简介下边就以列表的方式,对每一个工具链的作用进行介绍,在下一章进行实例演示。
mips-linux-gnu-addr2line :把程序地址转换为文件名和行号。
在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。
mips-linux-gnu-gcc:符合ISO标准的C编译器, 这个大家都在用,不再赘述。
mips-linux-gnu-objcopy:把一种目标文件中的内容复制到另一种类型的目标文件中。
mips-linux-gnu-ar:建立、修改、提取归档文件。
归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。
mips-linux-gnu-gcov:gcov是一个保险测试工具。
当构建一个程序时,gcov会监视一个程序的执行,并且会标识出执行了哪一行源码,哪一行没有执行。
mips-linux-gnu-objdump:显示一个或者更多目标文件的信息。
使用选项来控制其显示的信息。
它所显示的信息通常只有编写编译工具的人才感兴趣。
mips-linux-gnu-as:是GNU 汇编器,主要用来编译GNU C 编译器gcc 输出的汇编文件,它将汇编代码转换成二进制代码,并存放到一个object 文件中,该目标文件将由连接器ld 连接mips-linux-gnu-gdb:GNU调试器。
允许调试用C\C++和其他语言编写的应用程序。
它的基本运行方式是在shell环境下用命令方式进行调试程序和显示数据。
如果加上一些图形前端(如DDD等软件),则可以在一个更方便的图形环境下调试程序mips-linux-gnu-ranlib:产生归档文件索引,并将其保存到这个归档文件中。
交叉编译基本流程交叉编译是指在一个操作系统上编译出在另一个操作系统上运行的程序的过程。
在嵌入式系统中,常常需要在一个宿主机操作系统上开发和编译出在目标嵌入式操作系统上运行的应用程序。
交叉编译的基本流程如下:1.选择交叉编译工具链:首先需要选择适合于目标平台的交叉编译工具链。
工具链是一系列的编译器、链接器、调试器和库文件的集合,用于将代码从源平台编译成目标平台可执行文件的工具。
2.配置编译环境:在主机上配置相应的编译环境,包括设置环境变量、安装交叉编译工具链和相关的依赖项等。
这些步骤可以根据具体的工具链和宿主系统进行调整。
3.编写交叉编译工具链的配置文件:交叉编译工具链通常需要一个配置文件来指定工具链的路径和使用的交叉编译器的参数等相关信息。
一般情况下,这个配置文件被称为Makefile或CMakeLists.txt。
4.编写或调整应用程序的Makefile:在项目的根目录下创建一个Makefile文件来规定应用程序的编译和链接规则。
Makefile包含了目标文件、编译选项、链接选项等信息,用于自动化编译过程。
5.交叉编译应用程序:通过在主机上运行命令来触发交叉编译过程。
命令通常会调用交叉编译工具链中的编译器来编译源代码,并生成目标平台上的可执行文件。
编译过程中可能需要指定交叉编译器的路径、头文件和库文件路径等。
6.测试和调试:将交叉编译生成的可执行文件烧录到目标平台,并在目标平台上进行测试和调试。
如果出现问题,可以通过编写并运行调试程序、打印调试信息等方式来调试并分析问题的原因。
交叉编译的好处是节省开发时间和提高效率。
使用交叉编译可以将开发工作集中在宿主机上,而不需要在嵌入式设备上进行编译,从而加快开发速度。
此外,使用交叉编译还可以充分利用宿主机的计算资源,实现更好的编译性能。
然而,交叉编译也存在一些挑战。
首先,由于主机和目标平台的硬件、操作系统和架构等不同,可能会导致一些兼容性问题和平台相关的限制。
嵌入式操作系统实验报告姓名王威学号SA12226437 所在班级系统芯片实验名称实验一队友:张圣苗亚实验内容1、准备工作工作:安装virtualbox虚拟机工具,并安装ubuntu10.10系统、增强型工具,实现共享文件夹的自动挂载。
2、利用crosstool提供的脚本安装和相关资源编译面向的ARM的GCC工具。
详细内容1:安装虚拟机软件和虚拟机时要完成的主要步骤有:安装virtualbox,建立一台虚拟机,分配内存和硬盘,指定共享文件夹(主机和虚拟机可共同操作),指定操作系统镜像文件路径(相当于光盘,第一次启动时安装),安装虚拟操作系统,安装增强工具包,实现共享文件夹的自动挂载。
有几点需要注意:1、虚拟硬盘尽量分配大一些,之后再扩就比较麻烦。
2、共享文件夹不要有中文路径,不然挂载后看不到中文名称文件。
3、安装操作系统时,不能断网,需要下载各种资源,不然会异常。
详细内容2:安装gcc-4.1替换操作系统中的gcc-4.4.5,用它编译交叉编译器gcc-3.4.5和库文件glibc-2.3.2、gdb-6.5。
为了完成这样的目标,我们需要安装与脚本相关的工具,需要修改crosstool中的配置文件arm.dat以指定编译的目标位arm-linux。
需要修改crosstool中的脚本文件,指定编译的源文件和目的文件夹(后来建立),指定配置文件为gcc-3.4.5-glibc-2.3.2.dat,在该配置文件中,指定了交叉编译器和调试器、C库的版本。
最后运行脚本,实现了对GCC工具包的安装,包括gcc预处理器、汇编器、编译器、链接器、调试器、反汇编工具等等。
整个实验中我们需要的资源是crosstool-0.43.tar、gdb-6.5.tar、linux-2.6.8.tar,将放置在共享文件夹的crosstool工具拷贝到主文件夹下并解压,将gbd和linux文件拷贝到crosstool文件夹,拷贝linux-2.6.8.tar是因为编译时需要内核文件。
交叉编译问题记录-嵌⼊式环境下GDB的使⽤⽅法本⽂为作者原创,转载请注明出处:本⽂以嵌⼊式 Linux 环境下的 gdb 使⽤为例,记录交叉编译过程中⼀个⽐较关键的问题:configure 过程中 --build, --host, --target 参数的区别。
1. 交叉编译交叉编译是指在⼀种平台上编译出运⾏于另⼀种平台的程序。
这⾥的平台,涉及硬件和软件两个部分,硬件平台指 CPU 架构,软件平台指操作系统。
交叉编译主要针对嵌⼊式领域,因为嵌⼊式系统资源受限,没有办法在嵌⼊式平台上运⾏⼀套编译环境,因此需要在其他性能更强劲的平台上借助交叉编译⼯具链来制作可在嵌⼊式平台上运⾏的程序。
交叉编译与普通编译基本步骤⼀样:[1] configure在编译前进⾏配置。
如果 --host 参数与 --build 参数不同,则是交叉编译。
否则就是普通编译。
[2] make编译。
根据上⼀步 configure 配置⽣成的参数,调⽤相应的编译⼯具链编译⽣成⽬标程序。
[3] make install安装。
将 make ⽣成的⽬标程序安装到指定⽬录。
如果不运⾏ make install,⼿动拷贝到指定⽬录也可。
1.1 --build --host --target看⼀下 configure 步骤中 --build、--host 和 --target 三个参数的定义,下⾯在 gdb 源码⽬录运⾏ './configure --help'./configure --helpSystem types:--build=BUILD configure for building on BUILD [guessed]--host=HOST cross-compile to build programs to run on HOST [BUILD]--target=TARGET configure for building compilers for TARGET [HOST]源码经过编译⽣成可执⾏程序。
建立交叉编译环境交叉编译的任务主要是在一个平台上生成可以在另一个平台上执行的程序代码。
不同的CPU需要有不同的编译器,交叉编译如同翻译一样,它可以把相同的程序代码翻译成不同的CPU对应语言。
交叉编译器完整的安装涉及到多个软件安装,最重要的有binutils、gcc、glibc三个。
其中,binutils主要用于生成一些辅助工具;gcc则用来生成交叉编译器,主要生成arm-linux-gcc 交叉编译工具;glibc主要是提供用户程序所使用的一些基本的函数库。
自行搭建交叉编译环境通常比较复杂,而且很容易出错。
可以使用厂家提供的交叉编译器,只需将交叉编译器解压到根目录下即可(厂家已经做好这步)。
步骤:设置系统环境变量:在linux shell终端输入如下命令export PATH=$PATH:/usr/local/arm/arm-2009q3/bin/这样,内核或其他应用程序均可以用arm-none-linux-gnueabi-来指定使用该交叉编译器。
自行编写一个程序测试:示例helloworld.c:#include <stdio.h>int main(void){printf("hello world\n");return 0;}然后在命令行执行如下语句开始编译:$ arm-none-linux-gnueabi-gcc helloworld.c -o helloarm用file命令查看下生成的helloworld程序的格式:$ file helloarm如果输出以下信息,说明编译成功。
helloworld: ELF 32-bit LSB executeable, ARM, version 1, dynamically linked (uses shared libs), not stripped注:如果使用如下的命令来编译该文件。
⏹[root@localhost root]# gcc –o hello helloworld.c⏹[root@localhost root]# file hello1 / 2helloworld: ELF 32-bit LSB executeable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped可发现是80386格式,可以在虚拟机中直接./hello运行而用arm-none-linux-gnueabi-gcc编译的helloarm程序,是无法在虚拟机里用./helloarm执行的,但可以在ARM开发板中运行。
Chaper0501 嵌入式软件的交叉编译(2011-06-11-晚上研706)重庆大学王韬wtccee@65105925-614本节内容1.Makefile的作用?2.Makefile的内容?3.Make过程4.Makefile例子5.如何make?6.VxWorks操作系统中提供给用户的makefile变量什么是MakefileMakefile定义了整个工程的编译规则。
一个工程中的源文件不计其数,按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具。
Makefile的内容1、显式规则。
显式规则说明了,如何生成一个或多个目标文件。
Makefile的书写者明显指出要生成的文件、依赖文件及生成命令。
2、隐含规则。
Make具有自动推导的功能。
3、变量定义。
makefile中定义的变量,有点像C语言中的宏,当Makefile 被执行时,变量都会被扩展到相应的引用位置上。
4、文件指示。
包括了三个部分,(1) Makefile中引用另一个Makefile,像C 言中的include一样;(2)根据某些情况指定Makefile中的有效部分就像C语言中的预编译#if一样;(3)定义多行命令。
5、注释。
Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。
如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“\#”。
Makefile的内容--1显式规则目标:依赖命令目标可以是具体的文件,依赖可以是目标文件也可以是源文件,目标可以是假目标,并不生成具体的文件,只是代表一个具体的操作,常见的假目标为all,或者clean。
clean:rm edit $(objects)PHONY意思表示clean是一个“伪目标”,稳健的做法是:.PHONY : cleanclean :-rm edit $(objects)Makefile的内容--2隐含规则“隐含规则”也就是一种惯例,make会按照这种“惯例”心照不宣地来运行,那怕我们的Makefile中没有书写这样的规则。
隐含规则会使用一些我们系统变量,我们可以改变这些系统变量的值来定制隐含规则的运行时的参数。
如果要使用隐含规则生成你需要的目标,你所需要做的就是不要写出这个目标的规则。
Makefile的内容--2隐含规则1、编译C程序的隐含规则:“.o”的目标的依赖目标会自动推导为“.c”,并且其生成命令是“$(CC) –c $(CPPFLAGS) $(CFLAGS)”2、编译C++程序的隐含规则。
“.o”的目标的依赖目标会自动推导为“.cc”或是“.C”,并且其生成命令是“$(CXX) –c $(CPPFLAGS) $(CFLAGS)”。
(建议使用“.cc”作为C++源文件的后缀,而不是“.C”)3、汇编和汇编预处理的隐含规则。
“.o” 的目标的依赖目标会自动推导为“.s”,默认使用编译品“as”,并且其生成命令是:“$(AS) $(ASFLAGS)”。
“.s” 的目标的依赖目标会自动推导为“.S”,默认使用C预编译器“cpp”,并且其生成命令是:“$(AS) $(ASFLAGS)”。
4、链接Object文件的隐含规则。
“”目标依赖于“.o”,通过运行C的编译器来运行链接程序生成(一般是“ld”),其生成命令是:“$(CC) $(LDFLAGS) .o $(LOADLIBES) $(LDLIBS)”。
这个规则对于只有一个源文件的工程有效,同时也对多个Object文件(由不同的源文件生成)的也有效。
Makefile的内容--2隐含规则关于命令的变量AR 函数库打包程序。
默认命令是“ar”。
AS 汇编语言编译程序。
默认命令是“as”。
CC C语言编译程序。
默认命令是“cc”。
CXX C++语言编译程序。
默认命令是“g++”。
CPP C程序的预处理器(输出是标准输出设备)。
默认命令是“$(CC) –E”。
RM 删除文件命令。
默认命令是“rm –f”。
Makefile的内容--2隐含规则关于命令参数的变量如果没有指明其默认值,那么其默认值都是空。
ARFLAGS 函数库打包程序AR命令的参数。
ASFLAGS 汇编语言编译器参数。
CFLAGS C语言编译器参数。
CXXFLAGS C++语言编译器参数。
CPPFLAGS C预处理器参数。
Makefile的内容--3变量变量用来做什么?注意变量是大小写敏感的贮存一个文件名列表贮存可执行文件名贮存编译器旗标变量定义(自动变量)$@ 表示规则中的目标文件集。
在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
$< 依赖目标中的第一个目标名字。
如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。
注意,其是一个一个取出来的。
$^ 所有的依赖目标的集合。
以空格分隔。
如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
Makefile的内容—4文件指示1.子Makefile文件包含在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。
比如:有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么下面的语句:include foo.make *.mk $(bar)等价于:include foo.make a.mk b.mk c.mk e.mk f.mkinclude foo.make *.mk $(bar)make会在当前目录下首先寻找,如果没有找到,那么make还会在下面的几个目录下找:(1)“-I”或“--include-dir”参数所指定的目录。
(2) 目录<prefix>Makefile的内容—4文件指示2.使用条件判断使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。
条件表达式可以是比较变量的值,或是比较变量和常量的值。
<conditional-directive>;<text-if-true>;else<text-if-false>;endif其中<conditional-directive>;表示条件关键字,关键字有四个:ifneq、“ifneq”、 “ifdef”、 “ifndef”。
比如下面的例子,判断$(CC)变量是否“gcc”,如果是的话,则使用GNU函数编译目标。
libs_for_gcc = -lgnunormal_libs =foo: $(objects)ifeq ($(CC),gcc)$(CC) -o foo $(objects) $(libs_for_gcc)else$(CC) -o foo $(objects) $(normal_libs)endifMakefile的内容—4文件指示3.多行命令执行当依赖目标新于目标时,make会一条一条的执行其后的命令。
注意的是,如果你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。
exec:cd /home/hchenpwdexec:cd /home/hchen; pwd执行“make exec”时,第一个例子中的pwd会打印出当前的Makefile目录,而第二个例子中的pwd会打印出“/home/hchen”Make过程1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2.如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
3.如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
4.如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。
(这有点像一个堆栈的过程)当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。
Makefile例子CC = ccsimpchello.o: hello.c$(CC) -c hello.c –o hello.oclean:-vxrm hello.o如何make-build VxWorks如何make-build VxWorks如何make-build VxWorks如何make(Tornado工具)-build bootrom.hex如何make-build bootrom.hex如何make-build bootrom.hexVxWorks Makefile变量MACH_EXTRAEXTRA_MODULESLIB_EXTRAEXTRA_INCLUDE。