毕业设计(论文)-嵌入式交叉编译环境的研究与实现.docx_第1页
毕业设计(论文)-嵌入式交叉编译环境的研究与实现.docx_第2页
毕业设计(论文)-嵌入式交叉编译环境的研究与实现.docx_第3页
毕业设计(论文)-嵌入式交叉编译环境的研究与实现.docx_第4页
毕业设计(论文)-嵌入式交叉编译环境的研究与实现.docx_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。作者签名: 年 月 日 学位论文版权使用授权书本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。本学位论文属于1、保密 ,在_年解密后适用本授权书。2、不保密 。(请在以上相应方框内打“”)作者签名: 年 月 日 导师签名: 年 月 日 目 录摘 要1关键词1前言11 预备知识21.1嵌入式linux简介21.2交叉编译基础知识21.3交叉编译原理介绍31.4 了解linux常用命令32准备工作52.1 linux环境模式选择62.2 下载所需源文件63创建交叉编译环境73.1 创建前准备73.1.1 建立工作目录73.1.2 设置环境变量73.1.3 建立编译目录73.2 配置linux内核文件83.3 建立二进制工具(binutils)103.4 建立初始编译器(bootstrap gcc)123.5 建立c库(glibc)153.6 建立全套编译器(full gcc)184 创建交叉调试器184.1 交叉调试器的结构184.2 制作交叉调试器的方法195 验证交叉编译器206 总结21致谢21参考文献:21 22 24嵌入式交叉编译环境的研究与实现摘 要:交叉编译就是在一个平台生成可以在另一个平台执行的代码,它作为嵌入式系统开发的前提和准备,具有相当重要的作用,嵌入式系统的可执行文件都是通过交叉编译生成的。本文详细介绍了建立嵌入式交叉编译环境的具体步骤,通过分步编译binutils、gcc、glibc 和gdb,最终成功完成了基于arm s3c2440和嵌入式linux 的交叉编译环境的建立,并成功通过测试。这证明这个交叉编译环境具有非常好的可靠性和稳定性。abstract: cross-compilation is generated the execution of the code, which can be executed in another platform, in a platform. it has an important role as a precondition and preparation of the embedded system development. embedded system executable files are all generated by cross-compile. this paper describes the specific steps to establish embedded cross-compiler environment. cross-compiler environment based on arm s3c2410 and embedded linux was finally successfully constructed through compiled binutils, gcc, glibc and gdb step by step, and successfully tested. this proved the cross-compiling environment has very good reliability and stability.关键词:交叉编译环境,gcc,glbic,gdb,arm,嵌入式linuxkey words:cross-compilation environment, gcc, glbic, gdb, arm, embedded linux 前言:嵌入式系统无疑是当前最热门最有发展前途的it应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应的要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。像我们平常常见到的手机、pda、电子字典、可视电话、vcd/dvd/mp3 player、数字相机(dc)、数字摄像机(dv)、u-disk、机顶盒(set top box)、高清电视(hdtv)、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等等都是典型的嵌入式系统。伴随着嵌入式产品的迅速发展,使得嵌入式软件开发再度成为一个研究热点。 由于嵌入式设备的性能局限,往往不能通过本机编译得到所需软件的可执行程序。因此,以linux为主机操作系统,搭配一个交叉编译系统,为嵌入式设备生成可执行程序已成为现在日益流行的编译嵌入式软件的解决方案。而开放源码的编译器gcc,经过多年的发展,已能支持几乎所有知名厂商的处理器,是嵌入式软件开发中理想的交叉编译器。 但现有gcc支持的平台并不能满足层出不穷的嵌入式产品的开发需要,仍有许多平台得不到支持。随着信息技术的发展,微型化和专业化成为信息产品发展的新趋势,嵌入式产品成为信息产业的主流。而arm技术的日益成熟和广泛应用,使得基于arm核的微处理器已经成为嵌入式市场的首选。建立面向arm构架的嵌入式操作系统也就成为当前研究的热点问题。在众多的嵌入式操作系统中,许多开发人员都选择linux,主要是因为它是源码公开而且是免费的,可以让任何人将其修改移植到自己的目标平台系统里使用。系统可以通过配置内核,动态地加载和卸载内核模块机制,可以方便地在内核中添加新的组件或卸载不再需要的内核组件。交叉编译环境是嵌入式开发必不可少的工具,在进行项目开发的时候必须搭建一套开发环境,包括操作系统、连接器、编译器及调试器在内的软件开法工具。交叉编译的实现解决了嵌入式系统目标平台存储空间和运算能力有限的缺点,完善的工具链可以保证项目开发的进度和质量,是嵌入式开发的基础。1 预备知识1.1嵌入式linux简介嵌入式linux是将日益流行的linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。嵌入式linux既继承了internet上无限的开放源代码资源,又具有嵌入式操作系统的特性。嵌入式linux的特点是版权免费,性能优异,软件移植容易,代码开放,有许多应用软件支持,应用产品开发周期短,新产品上市迅速;有许多公开的代码可以参考和移植,而且实时性、稳定性、安全性好。1.2交叉编译基础知识交叉编译工具是嵌入式开发的基础,完善的工具链可以保证项目开发的进度和质量。 因此本文根据自己的硬件和软件需求搭建适合自己的工具链,这一步对于以后的开发是相当重要的。为了实现在linux 环境下编程,必须首先构建嵌入式linux 系统下的交叉编译开发环境。在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,其一般的静态存储空间比较小,而cpu 的主频也比较,针对这样的硬件环境,在arm 平台上进行本机编译就不太可能了,为了解决这个问题,交叉编译工具就应运而生了。要进行交叉编译,需要在主机平台上安装对应的交叉编译工具链,然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。1.3交叉编译原理介绍交叉编译简单地说,就是在一个平台上通过编译器编译某个源程序,生成另一个平台上的可执行代码。典型的交叉编译指的是在pc机上编译出能在嵌入式目标机上运行的可执行代码。因为嵌入式目标主机资源有限,不能完成自身程序的编译工作,从另外一个角度,嵌入式主机上运行的程序调试稳定后,很少需要修改,也没有必要具备完成自身程序的编译工作。因此,在嵌入式系统开发时,往往由宿主机开发程序,而目标机作为最后的执行机。两者在开发时需要交替结合进行。一般把编译程序的主机称为宿主机(host),把运行程序的嵌入式主机称为目标机(target)。为了使宿主机上开发的程序(应用程序和驱动程序)能够方便地下载到目标机上运行,一般还要在宿主机上配置好网络,使其支持nfs或tftp等网络服务,从而实现两台机器之间的文件共享。交叉编译环境一般由交叉编译器、交叉连接器和c程序库glibc等一系列的交叉工具集组成。这些交叉工具通过配置二进制工具binutils包来产生。通常基于arm的linux交叉编译器为arm-linux-gcc、交叉连接器arm-linux-ld。1.4 了解linux常用命令a) 文件目录类1) mkdir 目录名建立目录2) rmdir 目录名删除空目录3) rm -rf目录名无条件删除子目录4) cd 目录名改变当前目录(进入用户home目录:cd ;进入上一级目录:cd .)5) pwd查看自己所在目录6) du查看当前目录大小7) ls l显示目录文件列表(-a:增加显示隐含目录)其中:蓝:目录;绿:可执行文件;红:压缩文件;浅蓝:链接文件;灰:其他文件;红底白字:错误的链接文件8) cat 文件名浏览文件9) cp 源文件 目标文件复制文件(-r:包含目录)10) find 文件名查找文件11) ln 源文件 链接文件建立hard链接(-d:创建目录链接);b) 驱动挂载类1) df h检查硬盘使用情况2) fdisk l检查磁盘分区3)mount 挂载软硬光区,其中: 挂载光驱:mount -t auto /dev/cdrom /mnt/cdrom 挂载iso文件:mount -t iso9660 -o loop xxx.iso /path4)umount /mnt/目录名解除挂载(解除所有挂载:umount -a)5)mkfs建立文件系统c) 压缩解压类1) .tar解包:tar xvf filename.tar打包:tar cvf filename.tar dirname(注:tar是打包,不是压缩!)2) .gz解压1:gunzip filename.gz;解压2:gzip -d filename.gz压缩:gzip filename3) .tar.gz和.tgz解压:tar zxvf filename.tar.gz压缩:tar zcvf filename.tar.gz dirname4) .bz2解压1:bzip2 -d filename.bz2;解压2:bunzip2 filename.bz2压缩: bzip2 -z filename5) .tar.bz2解压:tar jxvf filename.tar.bz2压缩:tar jcvf filename.tar.bz2 dirname6).tar.bz解压:tar jxvf filename.tar.bz压缩:未知7).z解压:uncompress filename.z压缩:compress filename8).zip解压:unzip filename.zip压缩:zip filename.zip dirnamed) 源代码包安装1) 配置:解压目录下 ./configure2) 编译:解压目录下 make3) 安装:解压目录下 make installe) 进程控制类1) ps -auxw列出当前进程id:2) kill 进程id号终止单一进程: 3) killall 程序名终止该程序所有进程: 4) xkill终止x-window程序:5) top查看资源占用情况6) env查看环境变量值7) reboot重启8) shutdown -h now关机f) 用户帐号类 1) 增加用户帐号:(1)用户名:adduser 用户帐号名(2)设置密码: passwd 用户帐号名 2) 删除用户帐号:userdel 用户帐号名 3) 增加用户组:groupadd 用户组名 4) 删除用户组:groupdel 用户组名 5) 暂时终止用户帐号:passwd -l 用户帐号名 6) 恢复被终止帐号:passwd -u 用户帐号名f) 网络服务1) ifconfig显示网络接口参数2) mail显示系统邮件3) httpd -k start|stop启动/终止web服务4) ping xxx.xxx.xxx.xxx查看网络状况,联机状况:ping -dfnqrrv-c-i-i-l-p-s-t主机名称或ip地址2准备工作2.1 linux环境模式选择嵌入式linux操作系统是交叉编译环境搭建的重要基础,只有有了操作系统的支持,整个系统才能有条不紊的进行。linux操作系统的建立可以选择在pc机上安装linux操作系统或者在windows下安装虚拟linux环境软件。linux 开发环境方案有以下几种:1) windows + linux + 目标系统:安装多个操作系统只需一台计算机,但是在调试应用程序时需要在两个系统之间进行切换,会比较麻烦和费时;2) windows + cygwin + 目标系统:cygwin是一个模拟linux环境软件,此模式具有快速省时的优点,但并不能真实的模拟linux,且系统稳定性差;3) windows + vmware虚拟机(linux) + 目标系统:vmware 可以在不破坏原有操作系统的基础上,虚拟出一台真实的计算机出来,只需要在这台虚拟计算机上安装linux,其效果和真实linux系统完全一样。综合以上考虑, 选择第三种模式来搭建交叉编译环境, 使用的宿主机是win7+vmware 7. 0,虚拟机安装ubuntu系统,目标板是mini2440的arm9开发板。2.2 下载所需源文件以下是我选择和下载的源文件与各自的版本号,以及各源文件的下载地址:binutils-2.22.tar.bz2binutils工具包/gnu/binutils/gcc-4.4.3.tar.gzgcc编译器/gnu/gcc/gcc-4.7.0/glibc-2.11.1.tar.gzglibc库/gnu/glibc/glibc-linuxthreads-2.5.tar.gzglibc套件/gnu/glibc/glibc-ports-2.11.tar.gzglibc套件/gnu/glibc/linux-2.6.32.tar.gzlinux内核/pub/linux/kernel/v2.6/binutils主要是二进制代码的处理维护工具;gcc则是用来要生成(arm-linux-gcc)交叉编译工具,是主要的编译处理工具;glibc是个c库,几乎所有的应用程序都需要共享它提供的功能(除了kernel,bootload和其他完全不用c库的功能代码),因此glibc的存在有利于小系统或嵌入系统缩减系统总代码尺寸与存放空间(尽管单个的glibc库是比较大的),它主要是提供用户程序所使用的一些库文件。3创建交叉编译环境3.1 创建前准备3.1.1 建立工作目录为了让编译工作看起来不过意凌乱,我们需要在自己的用户目录下建立独立的工作目录,我的用户名是lei,因此用户目录为/home/lei,先建立一个项目目录embedded。leiubuntu:$ pwd/home/leileiubuntu:$ mkdir embedded再在这个项目目录 embedded 下建立三个目录 build-tools、kernel 和 tools。leiubuntu:$ cd embeddedleiubuntu:/embedded$ mkdir build-tools kernel tools build-tools-用来存放你下载的binutils、gcc和glibc的源代码和用来编译这些源代码的目录。kernel-用来存放你的内核源代码和内核补丁。tools-用来存放编译好的交叉编译工具和库文件。执行完后目录结构如下:leiubuntu:/embedded$ lsbuild-tools kernel tools 3.1.2 设置环境变量我们输出如下的环境变量方便我们编译。leiubuntu:$ export prjroot=/home/lei/embeddedleiubuntu:$ export target=arm-linuxleiubuntu:$ export prefix=$prjroot/toolsleiubuntu:$ export target_prefix=$prefix/$targetleiubuntu:$ export path=$prefix/bin:$path如果你不习惯用环境变量的,你可以直接用绝对或相对路径。我如果不用环境变量,一般都用绝对路径,相对路径有时会失败。环境变量也可以定义在.bashrc文件中,将上述语句加在文件最后,这样当你logout或换了控制台时,就不用老是export这些变量了。3.1.3 建立编译目录为了把源码和编译时生成的文件分开,一般的编译工作不在的源码目录中,要另建一个目录来专门用于编译。用以下的命令来建立编译你下载的binutils、gcc和glibc的源代码的目录。leiubuntu:$ cd $prjroot/build-toolsleiubuntu:/embedded/build-tools$ mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch其中各个目录的作用如下:build-binutils编译binutils的目录build-boot-gcc编译gcc 启动部分的目录build-glibc编译glibc的目录build-gcc编译gcc 全部的目录gcc-patch放gcc的补丁的目录再建立完以上目录后,将下载好的binutils-2.22.tar.gz、glibc-2.11.1.tar.gz、glibc-linuxthreads-2.3.6.tar.gz复制到build-tools 目录下。再做完上述工作后,来看一下我的 build-tools 目录,有以下内容:leiubuntu:/embedded/build-tools$ lsbinutils-2.22.tar.gz build-gcc gcc-patchbuild-binutils build-glibc glibc-2.11.1.tar.gzbuild-boot-gcc binutils-2.22.tar.gz glibc-linuxthreads-2.5.tar.gz3.2 配置linux内核文件修改顶层makefile文件,把从下载的内核源代码放入 $prjroot /kernel 目录。进入我的 kernel 目录,并解压内核源代码:leiubuntu:$ cd $prjroot/kernelleiubuntu:/embedded/kernel$ tar -xzvf linux-.tar.gz我们配置内核的目的是让 linux- 可以在mini2440上运行。首先,我们要使得linux- 的缺省目标平台成为arm 的平台。修改总目录下的makefile:leiubuntu:/embedded/kernel/linux-$ gedit makefile将原来的如下内容export kbuild_buildhost := $(subarch)arch ?= $(subarch)cross_compile ?=改为export kbuild_buildhost := $(subarch)arch ?= armcross_compile ?= arm-linux-其中arch=arm表示是以arm为体系结构,cross_compile=arm-linux-表示是以arm-linux-为前缀的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。leiubuntu:/embedded/kernel/linux-$ make小于2.4.19的内核版本解开会生成一个 linux 目录,没带版本号,就将其改名。$mv linux linux-2.6.x编译内核生成头文件leiubuntu:/embedded/kernel/linux-$ make menuconfig你也可以用 config 和 xconfig 来代替 menuconfig,但这样用可能会没有设置某些配置文件选项和没有生成下面编译所需的头文件。推荐大家用 make menuconfig,这也是内核开发人员用的最多的配置方法。注意在配置时一定要选择处理器的类型,这里选择三星的s3c2440a(system type-arm system type-/samsung s3c2440)配置完退出并保存,检查一下的内核目录中的 include/linux/version.h 和 include/linux/autoconf.h 文件是不是生成了,这是编译 glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也说明了你生成了正确的头文件。如编译时出现“make menuconfig requires the ncurses libraries.”,请执行以下指令,安装所需库文件。leiubuntu:/embedded/kernel/linux-$ sudo apt-get install libncurses*再执行make menuconfig指令。还要建立几个正确的链接leiubuntu:/embedded/kernel/linux-$ cd includeleiubuntu:/embedded/kernel/linux-/include$ ln -s asm-arm asmleiubuntu:/embedded/kernel/linux-/include$ cd asmleiubuntu:/embedded/kernel/linux-/include/asm$ ln -s arch-epxa archleiubuntu:/embedded/kernel/linux-/include/asm$ ln -s proc-armv proc接下来为你的交叉编译环境建立你的内核头文件的链接leiubuntu: $ mkdir -p $target_prefix/includeleiubuntu:$ ln -s $prjroot/kernel/linux-/include/linux $target_prefix/include/linuxleiubuntu:$ ln -s $prjroot/kernel/linux-/include/linux $target_prefix/include/asm也可以把 linux 内核头文件拷贝过来用leiubuntu: $ mkdir -p $target_prefix/includeleiubuntu:$ cp -r $prjroot/kernel/linux-/include/linux $target_prefix/includeleiubuntu:$ cp -r $prjroot/kernel/linux-/include/asm-arm $target_prefix/include 3.3 建立二进制工具(binutils)binutils是一些二进制工具的集合,其中包含了我们常用到的as和ld。首先,我们解压我们下载的binutils源文件。leiubuntu:$cd $prjroot/build-toolsleiubuntu:/embedded/build-tools$ tar -xvf binutils-2.22.tar.gz然后进入build-binutils目录配置和编译binutils。leiubuntu:/embedded/build-tools$ cd build-binutils leiubuntu:/embedded/build-tools/build-binutils$ ./binutils-2.22/configure -target=$target -prefix=$prefix-target 选项是指出我们生成的是arm-linux的工具,-prefix 是指出我们可执行文件安装的位置。会出现很多 check,最后产生 makefile 文件。有了 makefile 后,我们来编译并安装 binutils,命令很简单。leiubuntu:/embedded/build-tools/build-binutils$ makeleiubuntu:/embedded/build-tools/build-binutils$ make install看一下我们 $prefix/bin 下的生成的文件leiubuntu:/embedded/build-tools/build-binutils$ ls $prefix/binarm-linux-addr2line arm-linux-elfedit arm-linux-nm arm-linux-readelfarm-linux-ar arm-linux-gprof arm-linux-objcopy arm-linux-sizearm-linux-as arm-linux-ld arm-linux-objdump arm-linux-stringsarm-linux-c+filt arm-linux-ld.bfd arm-linux-ranlib arm-linux-strip我来解释一下上面生成的可执行文件都是用来干什么的:arm-linux-addr2line:将你要找的地址转成文件和行号,它要使用 debug 信息。arm-linux-ar:产生、修改和解开一个存档文件arm-linux-as:gnu的汇编器arm-linux-c+filt:c+ 和 java 中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标号,c+filt 就是实现这种反向的转化,根据标号得到函数名。arm-linux-elfedit:用处临时未知arm-linux-gprof:gnu汇编器预编译器arm-linux-ld:gnu的连接器arm-linux-ld.bfd:用处临时未知arm-linux-nm:列出目标文件的符号和对应的地址arm-linux-objcopy:将某种格式的目标文件转化成别的格式的目标文件arm-linux-objdump:显示目标文件的信息arm-linux-ranlib:为一个存档文件产生一个索引,并将这个索引存入存档文件中arm-linux-readelf:显示elf格式的目标文件的信息arm-linux-size:显示目标文件各个节的大小和目标文件的大小arm-linux-strings:打印出目标文件中可以打印的字符串,有个默认的长度,为4arm-linux-strip:剥掉目标文件的所有的符号信息3.4 建立初始编译器(bootstrap gcc)gcc是最首要的编译器。首先进入 build-tools 目录,将下载 gcc 源代码解压leiubuntu:$ cd $prjroot/build-tools leiubuntu:/embedded/build-tools$ tar -xvzf gcc-4.4.3.tar.gz然后进入gcc-4.4.3目录,给 gcc 打上补丁leiubuntu:/embedded/build-tools$ cd gcc-4.4.3leiubuntu:/embedded/build-tools/gcc-4.4.3$ patch -p1 gcc/cstamp-h.in在我们编译并安装 gcc 前,我们先要改$prjroot/build-tools/gcc-4.4.3/gcc/config/arm/t-linux中的部分内容:leiubuntu:$ gedit $prjroot/build-tools/gcc-4.4.3/gcc/config/arm/t-linux把 target_libgcc2-cflags = -fomit-frame-pointer fpic这一行改为target_libgcc2-cflags = -fomit-frame-pointer -fpic -dinhibit_libc -d_gthr_posix_h如果没定义-dinhibit,编译时将会报如下的错误././gcc-4.4.3/gcc/libgcc2.c:41: stdlib.h: no such file or directory././gcc-4.4.3/gcc/libgcc2.c:42: unistd.h: no such file or directorymake3: * libgcc2.a error 1make2: * stmp-multilib-sub error 2make1: * stmp-multilib error 1make: * all-gcc error 2如果没有定义 -d_gthr_posix_h,编译时会报如下的错误in file included from gthr-default.h:1, from ././gcc-4.4.3/gcc/gthr.h:98, from ././gcc-4.4.3/gcc/libgcc2.c:3034:././gcc-4.4.3/gcc/gthr-posix.h:37: pthread.h: no such file or directorymake3: * libgcc2.a error 1make2: * stmp-multilib-sub error 2make1: * stmp-multilib error 1make: * all-gcc error 2还有一种与-dinhibit同等效果的方法,那就是在你配置configure时多加一个参数-with-newlib,这个选项不会迫使我们必须使用newlib。我们编译了bootstrap-gcc后,仍然可以选择任何c库。接着就是配置boostrap gcc, 后面要用bootstrap gcc 来编译 glibc 库。leiubuntu:$ cd $prjroot/build-tools/build-boot-gccleiubuntu:/embedded/build-tools/build-boot-gcc$ ./gcc-4.4.3/configure -target=$target -prefix=$prefix -enable-languages=c -disable-threads这里需要注意一点,如果使用低于gcc-3.2版本的,须在最后加一个-without-headers。使用 gcc-3.2 以及 gcc-3.2 以上版本时,配置 boot-gcc 不能使用 -without-headers 选项,而需要使用 glibc 的头文件。这条命令中的 -target、-prefix 和配置 binutils 的含义是相同的,-without-headers 就是指不需要头文件,因为是交叉编译工具,不需要本机上的头文件。-enable-languages=c是指我们的 boot-gcc 只支持 c 语言。-disable-threads 是去掉 thread 功能,这个功能需要 glibc 的支持。接着我们编译并安装 boot-gcc:leiubuntu:/embedded/build-tools/build-boot-gcc$ make all-gccleiubuntu:/embedded/build-tools/build-boot-gcc$ make install-gccleiubuntu:/embedded/build-tools/build-boot-gcc$ make all-target-libgccleiubuntu:/embedded/build-tools/build-boot-gcc$ make install-target-libgcc我们来看看 $prefix/bin 里面多了哪些东西:leiubuntu:/embedded/build-tools/build-boot-gcc$ ls $prefix/binarm-linux-addr2line arm-linux-g+ arm-linux-gprof arm-linux-ranlibarm-linux-ar arm-linux-gcc arm-linux-jcf-dump arm-linux-readelfarm-linux-as arm-linux-gcc-4.4.3 arm-linux-ld arm-linux-sizearm-linux-c+ arm-linux-gccbug arm-linux-ld.bfd arm-linux-stringsarm-linux-c+filt arm-linux-gcj arm-linux-nm arm-linux-striparm-linux-cpp arm-linux-gcov arm-linux-objcopyarm-linux-elfedit arm-linux-gfortran arm-linux-objdump你会发现多了arm-linux-cpp、arm-linux-gcc、arm-linux-gcc-4.4.3、arm-linux-gccbug 、arm-linux-gcj 、arm-linux-gcov、 arm-linux-gfortran、arm-linux-jcf-dump这几个文件。其中部分文件的作用如下:arm-linux-cpp:gnu的c的预编译器arm-linux-gcc:gnu的c语言编译器arm-linux-gcc-4.4.3:gnu的c语言编译器,其实和arm-linux-gcc是一样的arm-linux-gcov:gcc 的帮助测试对象,用来解析和优化程序3.5 建立c库(glibc)glibc是交叉编译环境的运行库。首先解压 glibc-2.2.3.tar.gz 和 glibc-linuxthreads-2.2.3.tar.gz 源代码leiubuntu:$ cd $prjroot/build-toolsleiubuntu:/embedded/build-tools$ tar -xzvf glibc-2.11.1.tar.gzleiubuntu:/embedded/build-tools$ tar -xjf glibc-linuxthreads-2.5.tar.bz2 -directory=glibc-2.11.1leiubuntu:/embedded/build-tools$ tar -xzvf glibc-ports-2.11.tar.gz -directory=glibc-2.11.1然后进入 build-glibc 目录,建树用于设备glibc的config.cache文件:leiubuntu:/embedded/build-tools$ cd build-glibcleiubuntu:/embedded/build-tools/build-glibc$ gedit config.cache加入以下内容:libc_cv_forced_unwind=yeslibc_cv_c_cleanup=yeslibc_cv_arm_tls=yes建树完成之后,就可以配置 glibcleiubuntu:/embedded/build-tools/build-glibc$build_cc=gcc cc=$target-gcc ./glibc-2.11.1/configure -host=$target -target=$target -prefix=/usr -enable-add-ons -disable-profile -cache-file=config.cache -with-binutils=$prefix/bin/ -with-headers=$target_prefix/include/cc=$target-gcc 是把 cc 变量设成你刚编译完的boostrap gcc,用它来编译你的glibc。-enable-add-ons是告诉glibc用 linuxthreads 包,在上面我们已经将它放入了 glibc 源码目录中,这个选项等价于 -enable-add-ons=linuxthreads。-with-headers 告诉 glibc 我们的linux 内核头文件的目录位置。配置完后就可以编译和安装 glibcleiubuntu:/embedded/build-tools/build-glibc$ make编译报错:./ports/sysdeps/unix/sysv/linux/arm/sigrestorer.s:30: error: previous cfi entry not closed (missing .cfi_endproc)解决办法:leiubuntu:/embedded/build-tools/build-glibc$ gedit ./glibc-2.11.1/ports/sysdeps/unix/sysv/linux/arm/sigrestorer.s找到如下行:entry(_default_sa_restorer)在其下添加:end(_default_sa_restorer)找到如下行:entry(_default_rt_sa_restorer)在其下添加:end(_default_rt_sa_restorer)继续make编译leiubuntu:/embedded/build-tools/build-glibc$ make编译报错:allocatestack.c:247:33: 错误:tls_dtv_unallocated未声明(在此函数内第一次应用)解决办法:leiubuntu:/embedded/build-tools/build-glibc$ gedit ./glibc-2.14/nptl/allocatestack.cleiubuntu:/embedded/build-tools/build-glibc$ gedit ./glibc-2.14/elf/dl-tls.c 分别在文件中的include后面添加:#define tls_dtv_unallocated (void *) -1l)继续make编译leiubuntu:/embedded/build-tools/build-glibc$ make编译报错:/home/lei/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论