Ubuntu8.04下的ARM交叉编译工具链(arm-linux-)详细介绍.
Linux交叉编译环境及工具介绍
一体化电源Makefile文件介绍:
一体化电源代码目录结构: main---主程序 bin------可执行文件和规约so库 debug---存放主程序各文件的目标文件中间目录
include----主程序用头文件目录
monitor src-----主程序和规约库用头文件目录
ptlmodule---存放规约库文件目录
什么是交叉编译:
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码, 我们就称这种编译器支持交叉编译器。这个编译过程就叫交叉编译。 简单地 说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所 谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Opera ting System)。同一个体系结构可以运行不同的操作系统;同样,同一个操 作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平 台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT 平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
龙腾蓝天1808交叉编译环境:
1、解压缩到指定目录 tar zxvf tool.tar.gz
2、进入linux-devkit目录 3、./environment-setup 4、进入linux-devkit/bin目录,为arm-arago-linux-gnueabi-g++等工 具建立软链接。例如:ln –s arm-arago-linux-gnueabi-g++ arm-linu x-g++ 5、编辑/etc/profile ,添加环境变量。
ARM、linux常用服务器+交叉编译工具链
ARM、linux常用服务器+交叉编译工具链1. tftp服务器在安装linux时通常可供选择是否安装tftp服务器启动后可通过在控制终端输入netstat -a|grep tftp查看是否已经安装若已安装则为如下打印信息:[root@localhost /]# netstat -a|grep tftp若没有安装则可使用–ivh tftp-server-0.42-3.1.i386.rpm进行安装然后建立主要工作目录mkdir /tftpboot接下来配置tftp服务器/etc/init.d/tftp# default: off# description: The tftp server serves files using the trivial file transfer \par# protocol. The tftp protocol is often used to boot diskless \par# workstations, download configuration files to network-aware printers, \par # and to start the installation process for some operating systems.tftp_type = dgram= udp= yes= root= /usr/sbin/in.tftpd_args =-s /tftpboot= no_source = 11= 100 2= IPv4注意修改server_args= -s /tftpboot为你tftp工作目录。
接下来便是重启tftp 服务器了/etc/init.d/xinetd restart打印出如下信息[root@localhost /]# /etc/init.d/xinetd restartxinetd: [ OK ] xinetd: [ OK ]表示重启成功接下来便可查看是否已经安装成功[root@localhost /]# netstat -a|grep tftp. nfs服务器首先查看nfs服务器是否被安装(这里为red-had5)rpm –q nfs-utils若打印出如下信息则表示已经被安装[root@localhost ~]# rpm -q nfs-utilsutils-1.0.9-24.el5若没有安装nfs服务器则先下载相应的nfs服务器包百度一个即可然后rpm –ivh nfs- utils-1.0.9-24.el5.i386.rpm这里使用的nfs版本为utils-1.0.9-24.el5故不同版本安装不同,然后进入nfs配置/etc/exports/nfsroot/rootfs 211.67.216.* (rw,sync,no_root_squash).67.216.* 配置网段为自己IP地址同一网段然后启动NFS服务器/etc/init.d/nfs start 启动nfs服务器如下所示:[ OK ]NFS quotas: [ OK ]NFS daemon: [ OK ]NFS mountd: [ OK ]然后即可挂载nfs服务器上的共享目录了–t nfs xx.xx.xx.xx:/xx /mnt.xx.xx.xx为nfs服务器ip地址/xx 为需要挂载的目录接下来ls /mnt 即可查看是否挂载成功. samba服务器在安装linux时选中安装samba服务器然后这里就只需配置即可/etc/samba/smb.conf[homes]comment = Home Directoriesbrowseable = nowritable = yesvalid users = %Svalid users = MYDOMAIN%S然后粘贴修改如下[root]comment = Root Directoriesbrowseable = yeswritable = yespath = /valid users = smbvalid users = MYDOMAIN%S这里valid users = smb如果smb用户存在则不需添加否则需要添加smb然后设置smb账户登录密码–a smb重启smb服务器/etc/init.d/smb restart设置好linux ip后在windows命令行运行\xx.xx.xx.xx 输入账户密码即可访问linux目录了.xx.xx.xx为虚拟机linux IP地址通过chmod修改权限即可实现linux和windows文件共享了。
arm交叉编译扩展指令
arm交叉编译扩展指令介绍在嵌入式系统和移动设备中,使用ARM架构的处理器非常常见。
为了优化ARM指令集的使用,可以使用交叉编译扩展指令来提高程序的执行效率。
本文将详细介绍arm交叉编译扩展指令的概念、使用方法和优势。
什么是交叉编译交叉编译是指在一台主机上使用某种工具链来生成在另一种不同架构的目标平台上运行的可执行程序。
在ARM架构中,交叉编译可以在x86架构的主机上进行,生成可以在ARM处理器上运行的程序。
ARM架构简介ARM是一种低功耗、高性能的处理器架构,广泛应用于移动设备、嵌入式系统和物联网设备中。
ARM架构具有精简指令集,以节省功耗和提高性能为目标。
由于ARM 处理器的普及,交叉编译成为开发ARM平台软件的常见需求。
交叉编译的优势使用交叉编译可以在更强大的主机上进行开发和编译,然后将生成的可执行文件移植到目标平台上运行。
这样做的好处包括: 1. 提高编译速度:交叉编译可以利用主机的更高性能来加快编译过程,节省开发时间。
2. 方便调试:在主机上进行编译和调试可以更方便地定位和修复错误。
3. 可移植性:生成的可执行文件可以在多个目标平台上运行,提高了软件的可移植性和复用性。
ARM交叉编译工具链ARM交叉编译工具链是一组用于在x86主机上生成ARM可执行文件的工具集合。
常见的ARM交叉编译工具链包括: 1. GNU工具链:包括GNU编译器套件(GCC)、GNU调试器(GDB)等。
GNU工具链是开源的,广泛应用于ARM平台的开发中。
2. Clang/LLVM:Clang是一个开源的C/C++编译器,基于LLVM技术。
Clang/LLVM工具链具有较好的性能和可扩展性。
使用交叉编译扩展指令优化ARM程序交叉编译扩展指令是一种优化技术,可以通过使用特定的指令来提高ARM程序的性能。
下面介绍几种常见的交叉编译扩展指令。
NEON指令集NEON是ARM架构中的一种SIMD(单指令多数据)扩展指令集。
ARM-Linux交叉编译步骤
samba事先安装sudo apt-get install nfs-kernel-server交叉编译步骤1、创建目录s3c2440_recover2、设置网络文件系统的根目录配置文件/etc/exports在最后一行添加s3c2440_recover的绝对路径*(rw,sync,no_root_squash)重启nfssudo /etc/init.d/nfs-kernel-server restart3、arm开发板启动Bootloader 引导加载程序Kernel uImageFilesystemBootloader -》把内核的uImge加载到内存uImage 加载filesystem =》shell 用户空间4、编译器arm-linux-gcc-4.3.2.tar.gzsudo tar zxvf xxx.tar.gz -C /编译自动会解压到/usr/local/arm设置编译器脚本(自己创建),每次打开终端,若要使用arm编译器,则先source一下arm-compile.sh ()#!/bin/bashexport PA TH=$PATH:/usr/local/arm/4.3.2/bin############### 告诉系统编译器的路径(通过在PATH环境变量中添加)修改脚本可执行权限chmod u+x arm-compile.shsource arm-compile.sh4、Uboot 编译分别解压源码uboot-1.2-utu2440.tar.bz2按照uboot编译.txt5、内核编译准备工具修改过的内核源码Linux2.6.24_utu2440.tar.gz拷贝到crosscompile目录下解压tar zxvf linux inux2.6.24_utu2440.tar.gz制作镜像文件工具mkimage拷贝到/usr/sbin 或者/usr/bin 目录下参考脚本hw-kernel编译.txt内核编译时,会根据.config 的配置文件进行文件编译(即选择哪些模块,卸载哪些模块)Make menuconfig 就是一个图形裁剪的配置工具,操作结果会自动保存到.config操作步骤参hw-kernel编译.txt6 . Busybox 创建yaffs文件系统准备工具busybox-1.19.2.tar.bz2mkyaffsimage除开uboot、kernel之外的脚本文件第一个脚本mkroot.sh是用来创建根目录下的子目录的6.1 在某个目录下执行./mkroot.sh这时,会在当前路径下生成rootfs 目录及其子目录进入rootfs/dev 下创建console null操作如下:$cd rootfs/dev/$ su口令:# mknod -m 600 console c 5 1;mknod -m 666 null c 1 3;exit退出rootfs目录cd ../../6.2 解压busybox.1.19.2.tar.bz2$ cd busybox.1.19.2修改Makefile文件Gedit Makefile在164行CROSS_COMPILE ?=改为CROSS_COMPILE ?= arm-linux-make menuconfig设置交叉编译器的路径设置编译输出路径,即make install会把编译生成的东西放到指定路径配置menuconfigBusybox Settings --->//设置静态编译方式或者动态链接Busybox Settings ---> Build Options ---> [] Build BusyBox as a static binary (no shared libs)(/usr/local/arm/4.3.2/bin) cross compiler prefix[*] Build with Large File Support (for accessing files > 2 GB)Busybox Settings ---> Install Options ---> 中输入建立根文件系统的文件所在的路径busybox install prefix即rootfs的绝对路径makemake install备注:6.3 6.4让学生做总有问题,因为这两步其实是配置etc和lib故为了方便,已经都做好了,放在build/busybox目录下,直接拷贝到rootfs下即可6.3 配置rootfs下的文件信息修改和创建必要的文件cp -a busybox.1.19.2/examples/bootfloppy/etc/* rootfs/etccd rootfs/etc增加为SHELL导入全局变量的文件/etc/profilegedit etc/profile增加初始化文件gedit etc/inittabgedit etc/fstab增加初始化脚本gedit etc/init.d/rcS在etc下创建文件mdev.conftouch medev.conf6.4 动态链接库当前路径rootfs/libcp -a /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/* ./当前路径rootfs/usr/libcp -a /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/lib/libstdc++* ./当前路径:rootfs的上一级目录sudo mv mkyaffsimage /usr/bin/mkyaffsimage rootfs filesystem.yaffs6.5 sudo cp filesystem.yaffs /srv/tftp在CRT中run install-filesystem注意:要用arm-linux-gcc-4.3.2 编译出来的u-boot.bin uImage filesysetm.yaffs7 在arm上执行应用程序写个简单的hello world程序arm-linux-gcc hello.c -o armhello把armhello复制到s3c2440_recover 下启动开发板登陆到shell界面后(在CRT中进行操作)将虚拟机里的目录s3c2440_recover目录,通过NFS挂载到开发板的/mnt下mount -t nfs -o nolock 192.168.1.200:/home/guoji/share/crosscompile/s3c2440_recover /mnt 此时,在开发板下的/mnte下即可看到armhello将armhello拷贝到/home目录下,并执行./armhello。
交叉编译器arm-linux-gcc
交叉编译器arm-linux-gcc(⼀)交叉编译器简介在⼀种计算机环境中运⾏的编译程序,能编译出在另外⼀种环境下运⾏的代码,这个编译过程就叫交叉编译.简单地说,就是在⼀个平台上⽣成另⼀个平台上的可执⾏代码.(⼆)体系结构与操作系统(1)常见的体系结构有ARM结构、x86结构等.(2)常见的操作系统有linux,windows等.(3)同⼀个体系结构可以运⾏不同操作系统,如x86上可以运⾏Linux、Windows等,在ARM上可以运⾏Linux、WinCE.(4)同⼀个操作系统可以在不同的体系结构上运⾏,⽐如Linux可以运⾏在x86上,也可以运⾏在ARM上.(5)同样的程序不可能运⾏在多个平台上,⽐如Windows下应⽤程序不能在Linux下运⾏.如果⼀个应⽤程序想在另⼀个平台上运⾏,必须使⽤针对该平台的编译器,来重新编译该应⽤程序的⼆进制代码.⽐如在Linux系统下运⾏Windows平台的QQ软件,必须按照以下⼏个步骤:1.QQ程序源代码2.使⽤Linux下的编译器来编译QQ软件的源代码这样编译出来的可执⾏程序就可以在Linux下运⾏了.所以,如何使ARM来运⾏⽤户的应⽤程序呢,就需要⽤到针对ARM的编译器来编译程序.(三)使⽤交叉编译器的原因ARM上可以运⾏操作系统,所以⽤户完全可以将ARM当做计算机来使⽤,理论上也可以在ARM上使⽤本地的编译器来编译程序.但是,编译器在编译程序时,会产⽣⼤量的中间⽂件,这会占⽤很⼤的内存和磁盘空间,且对CPU处理速度要求较⾼,⽐如S3C2440A内存、磁盘空间只有⼏⼗到100多兆,CPU只有400-500MHz,完全达不到编译程序的要求.所以,在进⾏ARM-linux嵌⼊式开发时必须在PC机(x86结构)上编译出能够运⾏在ARM上的程序,然后再将程序下载到ARM中来运⾏.这就⽤到了交叉编译器.要进⾏交叉编译,⽤户需要在主机平台上安装对应的交叉编译⼯具链(cross compilation tool chain),然后⽤这个交叉编译⼯具链编译⽤户的源代码,最终⽣成可在⽬标平台上运⾏的代码.交叉编译⼯具链可以从⽹上下载,也可以⾃⼰制作.但编译器不是万能的,受版本限制,编译某些程序时会报错.常见的交叉编译⼯具链有:(1)Cross -2.95.3 tar: 该版本较早,除了编译vivi外⼀般不使⽤.(2)arm920t-eabi.tgz: 4.1.2版本的编译器,⽀持eabi,可以编译TX2440A开发板上的所有程序.(3)arm-linux-gcc: 4.3.2版本的编译器,⽀持eabi,是最常见的交叉⼯具链.Attention什么是EABIEABI,Embeded application binary interface,即嵌⼊式应⽤⼆进制接⼝,是描述可连接⽬标代码、库⽬标代码、可执⾏⽂件影像、如何连接、执⾏和调试以及⽬标代码⽣成过程,和c, c++语⾔接⼝的规范,是编译连接⼯具的基础规范,也是研究它们⼯作原理的基础.简⽽⾔之,EABI就是⼀种编译规范,交叉编译器在编译时,对于浮点运算会使⽤硬浮点运算,⽽对于没有硬浮点运算的处理器,⽐如S3C2440,会使⽤软浮点,但这样会在速度上受到很⼤的限制,⽽EABI则对浮点运算进⾏了优化,提⾼了浮点运算的性能,节省了编译时间.(四)安装交叉⼯具链arm-linux-gcc 4.3.2安装交叉编译器arm-linux-gcc就是在主机平台(pc机的Linux操作系统)上安装对应的交叉编译⼯具链,换句话说,是将交叉编译器arm-linux-gcc 4.3.2在Linux操作系统下安装.安装步骤:(1)启动Samba服务器,打开共享⽬录/home/lishuai,将压缩⽂件arm-linux-gcc-4.3.2.tgz复制到/home/lishuai下.(2)解压软件包arm-linux-gcc-4.3.2.tgz.[root@localhost lishuai]#tar xzvf arm-linux-gcc4.3.2.tgz1.⽬录4.3.2就是该交叉编译器的⽬录.从arm-linux-gcc-4.3.2.tgz解压信息来看,该软件包需要解压在usr/local/arm下,⽽实际却解压到了共享⽬录/home/lishuai下2.进⼊⽬录usr/local/内,并没有找到arm⽂件夹,所以需要新建⼀arm⽂件夹,再将⽬录4.3.2移动到新建⽬录usr/local/arm下.其中,4.3.2/bin就是arm-linux-gcc的可执⾏⽂件.[root@localhost local]#mv /home/lishuai/usr/local/arm/4.3.2 ./3.进⼊⽬录/usr/local/arm/4.3.2/bin,可以看到不同类型的编译器.但在ARM下经常⽤到是arm-linux-gcc.其实它也是⼀个gcc编译器,与gcc 使⽤⽅法⼀致,不过该编译器是针对arm体系结构、Linux操作系统的编译器.利⽤该编译器就可以编译出运⾏在ARM上的Linux操作系统下的应⽤程序.4.进⼊⽬录/usr/local/arm/4.3.2/arm-none-linux-gnueabi.其中,lib⽬录下存放的是库⽂件,⽤户编写的应⽤程序在运⾏时就依赖于这些库⽂件.5.此时还不能编译源码,系统⼀般会提⽰找不到命令arm-linux-gcc.这是环境变量在作祟.所以必须修改环境变量PATH.[root@localhost lishuai]#vi /etc/profile在"export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC"这⼀⾏的下⾯添加环境变量,输⼊:export PATH=/usr/local/arm/4.3.2/bin:$PATH指定变量PATH为交叉编译器的路径,⽬的是告诉操作系统可以到⽬录/usr/local/arm/4.3.2/bin下查找可执⾏⽂件6.[root@localhost lishuai#:source /etc/profile//使已修改的配置⽂件/etc/profile⽣效7.查看arm-linux-gcc编译器的版本[root@localhost lishuai]#arm-linux-gcc -v(五)arm-linu-gcc应⽤实例实例:如何使⽤交叉编译器编译源码包boa-0.94.13.tar.tar1. 启动SMB服务器,将源码包放在共享⽂件夹/home/lishuai下2. 输⼊命令: tar xzvf boa-0.94.13.tar.tar//解压该源码包//⼀般的源码包内有Makefile⽂件,执⾏make就可以编译,但该源码包内没有,此时执⾏make是⽆效的//仍然没有Makefile,但找到了configure⽂件,通过执⾏configure⽂件可以⽣成Makefile[root@localhost lishuai]# ./configure//运⾏configure⽂件,⽣成了Makefile⽂件//由于要编译出在ARM平台上的程序,就需要使⽤交叉编译器.在Makefile⽂件内的绿⾊⼤写字母都是Makefile变量,可以看到变量CFLAGS = -g -o2 -pipe -Wall -l,该变量是设置编译选项;变量CC = gcc,该变量是设置需要使⽤的编译器.由于要使⽤交叉编译器arm-linux-gcc,所以该变量应设置为CC = arm-linux-gcc,CPP = arm-linux-gcc -E,保存并退出.[root@localhost lishuai]#make//执⾏make进⾏编译//⽣成名为boa的可执⾏程序,该程序可下载到ARM内来执⾏其实,这个过程也叫做移植.移植就是将⼀个源码包经过修改、配置、交叉编译,然后下载到⼀个平台上运⾏.⽐如经常移植的有Bootloader、内核、QT等.。
嵌入式Linux交叉编译的工具链
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:产生归档文件索引,并将其保存到这个归档文件中。
linux交叉编译工具链
finish 用于运行直到当前函数结束(注意 不是整个程序)
c用于恢复程序的运行,断点后恢复执行
q(quit)离开gdb调试器
//查看elf文件信息
arm-linux-readelf -a fee
//查看elf文件的动态链接库
arm-linux-readelf -d fee
info 查看信息 如info b 查看设置的断点的信息
r(run)运行程序 默认从开头运行,也可以跟行号 如r 7
p(print)用于查看变量的值,如p result
s(step)单步运行,与n(next)的区别是,如果有函数调用的时候
s会进入函数,但n会当做一条语句跳过
-static 静态链接
-O2优化
/***************************/
启动gdb调试
gcc -g tcp_server.c -o ser //先生成带调试信息的执行文件
gdb调试命令
gdb ser //载入文件
l(list)查看文件
b(breakpoint)设置断点 b后面加上要设置断点的行号,如 b 12
/****************方法一********************/
vi /etc/profile添加pathmunge /usr/local/arm/4.3.3/bin
修改后 执行sourort $PATH 显示命令路径环境变量
-c只编译不连接,生成目标文件 “.o”
如gcc -c tcp_server.s -o tcp_server.o
把目标文件tcp_server.o链接库,生成可执行文件tcp_server
linux arm交叉编译程序步骤
linux arm交叉编译程序步骤下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!在嵌入式系统开发中,使用ARM架构是非常常见的选择。
交叉编译工具链的介绍
交叉编译工具链的介绍
交叉编译工具链是一种由编译器、连接器和解释器组成的综合开发环境,它可以在一种平台上编译出能运行在体系结构不同的另一种平台上的程序。
例如,在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平
台上的程序。
编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行。
虽然两个平台用的都是Linux系统,但机器指令不同,所以需要交叉编译工具链进行编译。
交叉编译工具链主要由binutils、gcc和glibc三个部分组成。
有时出于减
小libc库大小的考虑,也可以用别的c库来代替glibc,例如uClibc、dietlibc和newlib。
此外,从授权上,交叉编译工具链可以分为免费授权版和付费授权版。
免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译制作),第二是Codesourcery,第三是Linora。
构建交叉编译工具链通常有以下两种方法:
1. 分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。
2. 通过Crosstool脚本工具来实现一次编译,生成交叉编译工具链。
该方法相对于第一种要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。
以上内容仅供参考,如需更多信息,建议查阅关于交叉编译工具链的资料或咨询专业技术人员。
arm-linux-gcc交叉工具链的安装和使用
arm-linux-gcc交叉工具链的安装和使用分类:linux内核工具使用2013-01-18 01:01 2295人阅读评论(0) 收藏举报1、安装arm-linux-gcc交叉工具链[root@localhost Denny]# lsarm-linux-gcc-4.3.2.tgz Desktop gcc kernel modules shell实验 smb.conf tftp安装包 wireshark软件包at_remind.c file gdb makefiles samba安装包 smb test wireless[root@localhost Denny]# tar zxvf arm-linux-gcc-4.3.2.tgz-C / // -C 参数指的是解压到根目录下面[root@localhost /]# cd /usr/local/[root@localhost local]# lsarm bin etc games include lib libexec sbin share src[root@localhost local]# cd arm/4.3.2/arm-none-linux-gnueabi/bin/ lib/ libexec/ share/[root@localhost local]# cd arm/4.3.2/bin/ // 安装在 /usr/local/arm/4.3.2/bin/ 的“bin”目录下面[root@localhost bin]#[root@localhost bin]# /usr/local/arm/4.3.2/bin/arm-linux-gcc // arm-linux-gcc 使用方法1:跟上“全路径”[[root@localhost bin]# echo $PATH/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bi n:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin[root@localhost bin]# export $PATHbash: export:`/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/b in:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin': not a valid identifier[root@localhost bin]# vi /etc/proprofile profile.d/ protocols[root@localhost bin]# vi /etc/profile // arm-linux-gcc 使用方法2:添加路径到环境变量中去,在系统的时候就可以“任何地方”使用 arm-linux-gcc[root@localhost bin]## Path manipulationif [ "$EUID" = "0" ]; thenpathmunge /sbinpathmunge /usr/sbinpathmunge /usr/local/sbinpathmunge /usr/local/arm/4.3.2/bin //环境变量添加的位置fi[root@localhost file]# cat hello.c#include <stdio.h>int main(){char *p="hello world!!";printf("%s:",*p); // 错误:字符串的输出 printf("%s:",p); 不用加*p(字符串指针),和其他指针不同return 0;}[root@localhost file]# vi hello.c[root@localhost file]# gcc hello.c -o hello // x86编译方式[root@localhost file]# ./hello // 在x86上能够运行hello world!!:[root@localhost file]# arm-linux-gcarm-linux-gcc arm-linux-gcc-4.3.2 arm-linux-gcov[root@localhost file]# arm-linux-gcc hello.c -o hello1 // ARM编译方式[root@localhost file]# lsfork hello hello1 hello.c lib_file sys_file time_file[root@localhost file]# ./hello1 // 在x86上不能够运行bash: ./hello1: cannot execute binary file[root@localhost file]#2、arm-linux-gcc交叉编译工具的使用今晚用了:arm-linux-objdump -S -D hello 反汇编指令时,遇到以下提示的错误:arm-linux-objdump: Can't disassemble for architecture UNKNOWN!现在还不知道是什么错误引起的,等着明天再解决了!!!!!!!原因是:由于上面用了“gcc hello.c -o hello x86编译方式” 和“arm-linux-gcc hello.c -o hello1 ARM编译方式”产生了hello 和hello1 对应不同平台的文件,当然用“arm-linux-objdump -S -D hello”用arm反汇编指令对x86平台产生的bin文件进行反汇编,肯定出现错误(1)、反汇编arm-linux-objdump 使用[root@localhost file]arm-linux-objdump -S -D helloarm-linux-objdump: Can't disassemble for architecture UNKNOWN![root@localhost file]# lsfork hello hello1 hello.c lib_file sys_file time_file // hello 是x86编译出来的,hello1是arm编译出来的[root@localhost file]# arm-linux-gcc -g hello.c -o hello1 // -g编译产生带有调试的信息的文件(反汇编后:c语言才能和汇编语言对应上)[root@localhost file]# arm-linux-objdump -D -S hello1 >log[root@localhost file]# lsfork hello hello1 hello.c lib_file log sys_file time_file[root@localhost file]# vi log // 查看对应的文件如下00008380 <main>:#include <stdio.h>int main(){8380: e92d4800 push {fp, lr}8384: e28db004 add fp, sp, #4 ; 0x48388: e24dd008 sub sp, sp, #8 ; 0x8char *p="hello world!!";838c: e59f3020 ldr r3, [pc, #32] ; 83b4 <main+0x34>8390: e50b3008 str r3, [fp, #-8]printf("%s:",p);8394: e59f001c ldr r0, [pc, #28] ; 83b8 <main+0x38>8398: e51b1008 ldr r1, [fp, #-8]839c: ebffffc7 bl 82c0 <_init+0x48>return 0;83a0: e3a03000 mov r3, #0 ; 0x0}(2)arm-linux-readelf 文件查看工具[root@localhost file]# arm-linux-readelf -a hello1 >logELF Header: //主要查看这个头文件Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00Class: ELF32Data: 2's complement, little endian //采用的是小端模式(程序运行不起来,硬件平台是打断格式,交叉工具链是小端格式)Version: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: EXEC (Executable file)Machine: ARM //程序运行在ARM平台上Version: 0x1Entry point address: 0x82ccStart of program headers: 52 (bytes into file)Start of section headers: 2488 (bytes into file)Flags: 0x5000002, has entry point, Version5 EABISize of this header: 52 (bytes)Size of program headers: 32 (bytes)Number of program headers: 8Size of section headers: 40 (bytes)Number of section headers: 37Section header string table index: 34[root@localhost file]# arm-linux-readelf -d hello1 // -d 指的是查看程序所用的共享链接库Dynamic section at offset 0x470 contains 24 entries:Tag Type Name/Value0x00000001 (NEEDED) Shared library: [libc.so.6] // 程序所用到的共享链接库(程序运行不起来,可能找不到共享链接库,把所需要的库考到路径下)0x0000000c (INIT) 0x82780x0000000d (FINI) 0x84340x00000019 (INIT_ARRAY) 0x104640x0000001b (INIT_ARRAYSZ) 4 (bytes)0x0000001a (FINI_ARRAY) 0x104680x0000001c (FINI_ARRAYSZ) 4 (bytes)。
交叉编译工具链使用
交叉编译工具链使用随着嵌入式系统和移动设备的普及,交叉编译工具链的重要性也越来越突出。
交叉编译工具链可以将开发环境和目标环境分离,使得开发人员可以在自己的开发环境中使用相同的工具和库来编译和调试程序,而无需了解目标环境的具体情况。
本文将介绍交叉编译工具链的基本概念和使用方法,帮助读者更好地理解和应用交叉编译工具链。
一、什么是交叉编译工具链交叉编译工具链是一组工具和库,用于在一个操作系统上编译生成在另一个操作系统上运行的程序。
通常情况下,交叉编译工具链包括以下几个部分:1. 交叉编译器:用于将源代码编译成目标代码的工具。
由于目标操作系统和开发操作系统的不同,交叉编译器需要支持不同的指令集和库。
2. 交叉链接器:用于将目标代码和库链接成可执行文件的工具。
由于目标操作系统和开发操作系统的不同,交叉链接器需要支持不同的格式和库。
3. 交叉调试器:用于在开发环境中调试目标程序的工具。
由于目标操作系统和开发操作系统的不同,交叉调试器需要支持不同的调试协议和接口。
4. 目标库:用于在目标环境中运行程序的库。
由于目标操作系统和开发操作系统的不同,目标库需要支持不同的接口和功能。
二、为什么需要交叉编译工具链在传统的编译方式中,开发人员需要在目标环境中安装编译器和库,然后在目标环境中编译和运行程序。
这种方式存在以下几个问题:1. 依赖目标环境:开发人员需要了解目标环境的具体情况,包括操作系统、硬件平台、库版本等,才能正确地编译和运行程序。
2. 缺乏灵活性:开发人员需要在目标环境中安装和配置编译器和库,这可能会受到目标环境的限制,导致开发过程缺乏灵活性。
3. 不便于调试:在目标环境中调试程序可能会受到硬件限制、网络限制等因素的影响,导致调试过程不便。
交叉编译工具链解决了这些问题,使得开发人员可以在自己的开发环境中使用相同的工具和库来编译和调试程序,而无需了解目标环境的具体情况。
三、如何使用交叉编译工具链使用交叉编译工具链需要以下几个步骤:1. 安装交叉编译工具链:在开发环境中安装交叉编译工具链。
linux交叉编译工具的安装
2. 拷贝工具链到根目录下
3. 解压工具链
4. 自动生成/usr/local/arm/3.4.1 目录
5. 在etc/bashrc 中添加环境变量
6. 重起Linux 后查看PATH环境变量并运行交叉
编译工具
交叉编译工具的安装
1. 交叉编译能运行在体系 结构不同的另一种平台上的程序,比如在PC平台 上编译出能运行在X86 CPU 平台上的程序在以 ARM为内核的CPU平台上是不能运行的。相对于 交叉编译,平常做的编译叫本地编译,编译得到 的程序也是在本地执行。用来编译跨平台程序的 编译器就叫交叉编译器。要生成目标机上运行的 程序,必须要用交叉编译工具链来完成。
【VIP专享】Linux交叉编译环境及工具介绍
1、建立内核头文件
Linux Headers
Gcc source
Host gcc
Binutils Source
2
3
Target Binutil tools
Target Bootstrap gcc
Glibc source
Gcc source
Target glibc
Target Full gcc
建立交叉编译环境:
1、建立内核头文件 主要是生成include/linux/version.h 和 include/linux/autoconf.h 文件,这是编 译 glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也说明了你生成了 正确的头文件。
2、针对目标系统的二进制工具binutils; The GNU Binutils are a collection of binary tools. binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序, 如汇编(as)、链接(ld)、静态库归档(ar)、反汇编(objdump)、 elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。 通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常 工作的。
4、创建一个交叉编译版本的glibc。 这里最容易出现问题。glibc是一个提供系统调用和基本函数的C语言库,比如 open,malloc和printf等,所有动态链接的程序都要用到它。创建glibc需要的时间 很长。 5、重新创建gcc(称为full gcc)。 因为前面创建gcc的过程没有编译C++编译器,现在glibc已经准备好了,所以这 个步骤将产生一个更完整的full gcc编译器。
linux内核交叉编译过程详解
linux内核交叉编译过程详解交叉编译是在一个平台上生成适用于另一个平台的可执行文件的过程。
下面将详细解释在Linux下的内核交叉编译过程:1.环境搭建:o安装交叉编译工具链。
这些工具通常以静态链接的方式提供,例如gcc-arm-linux-gnueabi、binutils-arm-linux-gnueabi。
o配置本地的Makefile文件,以指定交叉编译工具链的路径。
2.获取内核源码:o从官方网站或git仓库下载目标内核的源码。
3.配置内核:o运行makemenuconfig或其他配置工具,根据目标平台的硬件和需求选择合适的配置选项。
o保存配置,生成.config文件。
4.交叉编译内核:o运行make命令开始编译过程。
由于内核很大,此过程可能需要很长时间。
o在编译过程中,内核将被编译成可在目标平台上运行的二进制文件。
5.打包编译好的内核:o内核编译完成后,需要将其打包成适合在目标平台上安装的形式。
这通常涉及到创建引导加载程序(如U-Boot)所需的映像文件。
6.测试和调试:o将编译好的内核和相关文件复制到目标板上,进行启动和测试。
o如果遇到问题,需要进行调试和修复。
7.部署:o一旦内核能够正常工作,就可以将其部署到目标设备上。
这可能包括将其集成到设备固件中,或者作为独立的操作系统运行。
8.维护和更新:o根据需要更新内核版本或进行其他更改,重复上述步骤。
在整个过程中,确保你的交叉编译环境和目标硬件的文档齐全,并遵循相应的开发指导原则。
对于复杂的项目,可能还需要进行更深入的定制和优化。
Ubuntu系统下arm-linux-gcc交叉编译环境搭建过程
Ubuntu系统下arm-linux-gcc交叉编译环境搭建过程搭建所需环境Linux版本:Ubuntu 14.10交叉编译器版本:arm-linux-gcc-4.4.3资源链接何为交叉编译环境搭建交叉编译环境,即安装、配置交叉编译⼯具链。
在Ubuntu环境下编译出嵌⼊式Linux系统所需的操作系统、应⽤程序等,然后再上传到⽬标机上。
交叉编译⼯具链是为了编译、链接、处理和调试跨平台体系结构的程序代码。
对于交叉开发的⼯具链来说,在⽂件名称上加了⼀个前缀,⽤来区别本地的⼯具链。
例如,arm-linux-表⽰是对arm的交叉编译⼯具链,arm-linux-gcc表⽰是使⽤gcc的编译器。
除了体系结构相关的编译选项以外,其使⽤⽅法与Linux主机上的gcc相同,所以Linux编程技术对于嵌⼊式同样适⽤。
不过,并不是任何⼀个版本拿来都能⽤,各种软件包往往存在版本匹配问题。
例如,编译内核时需要使⽤arm-linux-gcc-4.3.3版本的交叉编译⼯具链,⽽使⽤arm-linux-gcc-3.4.1的交叉编译⼯具链,则会导致编译失败。
gcc和arm-linux-gcc的区别就是gcc是linux下的C语⾔编译器,编译出来的程序在本地执⾏,⽽arm-linux-gcc⽤来在linux下跨平台的C语⾔编译器,编译出来的程序在⽬标机(如ARM平台)上执⾏,嵌⼊式开发应使⽤嵌⼊式交叉编译⼯具链。
搭建步骤1.解压缩下载arm-linux-gcc-4.4.3.tar.gz压缩包,并将其放在/usr/local/⽬录下,使⽤解压缩命令将其解压缩⾄该⽂件夹内:tar zxvf arm-linux-gcc-4.4.3.tar.gz现在交叉编译程序集都在/usr/local/arm-linux-gcc-4.4.3/bin⽂件夹下。
2.配置环境变量配置环境变量,把交叉编译⼯具链的路径添加到环境变量PATH中去,这样就可以在任何⽬录下使⽤这些⼯具。
arm交叉编译详解
arm交叉编译详解转载⾃ , 有修改CSDN GitHub本作品采⽤进⾏许可, 转载请注明出处本⽂主要介绍了什么是,为何要有交叉编译;解释了什么是⼯具链,什么是交叉⼯具链;详解解释了交叉编译器的名字的命名规则,以及如何获得交叉编译器,制作交叉编译器的各种⼯具,使⽤已有的交叉编译器和⾃⼰⼿动编译交叉编译器之间的对⽐;最后总结了交叉编译⽅⾯的⼼得和注意事项。
本⽂提供多种格式供:12345678在线阅读下载(7zip压缩包)HTML版本的在线地址为:有任何意见,建议,提交bug等,都欢迎去讨论组发帖讨论:2015-05-23修订历史修订 1.3.0 2015-05-23 crl将帖⼦内容整理过来2. 添加了关于交叉编译器命名规则的解释3. 添加了使⽤已有的交叉编译器和⾃⼰⼿动编译交叉编译器之间的对⽐4. 补充完整帖⼦引⽤5. 添加交叉编译器eldk的下载地址本⽂章遵从:署名-⾮商业性使⽤ 2.5 中国⼤陆(CC BY-NC 2.5)前⾔1. 本⽂⽬的本⽂⽬的在于,介绍关于交叉编译⽅⾯的概念,以及如何获得和制作交叉编译器等等内容。
1. 待完成有空再去⾃⼰,不⽤⼯具,⼿动的,从头到尾的,制作⼀个交叉编译器。
然后再把内容整理过来。
1 交叉编译简介1.1 什么是交叉编译解释什么是交叉编译之前,先要明⽩⼀个概念:本地编译我们之前常见的软件开发,都是属于本地编译:在当前的PC下,x86的CPU下,直接编译出来程序,可以运⾏的程序(或者库⽂件),其可以直接在当前的环境,即x86的CPU下,当前电脑中,运⾏。
此时的编译,可以叫做,本地编译,即在当前⽬标平台下,编译出来的程序,也只是放到当前平台下,就可以运⾏的。
交叉编译,是⼀个和,本地编译,相对应的概念。
⽽所谓的,交叉编译,就是:在⼀种平台上编译,编译出来的程序,是放到别的平台上运⾏即编译的环境,和运⾏的环境,不⼀样,属于交叉的,此所谓cross交叉编译,这个概念,主要和有关。
ARM交叉编译链的制作
ARM交叉编译链的制作1. 直接下载已经编译好的文件。
例如:,这里提供已经编译好的cross,如cross-3.3.2.tar.bz2,cross-3.0.tar.bz2。
直接下载某个包后解压,然后创建合适的链接或者输出环境变量即可调用。
这种做法操作很简单,但是不能根据自己的需求去定义,只能选择已经编译好的东西。
2. 自己动手利用crosstool来制作。
A. 在CROSSTOOL官方网站下载源码包,解压,进入解压后的目录。
$sudowget /crosstool/crosstool-0.42.tar.gz$sudo tar -xzvf crosstool-0.42.tar.gz$cd crosstool-0.42B. 以ROOT建立目录,存放生成的交叉编译链改变该目录的所有者为普通用户例如,存放生成的交叉编译链目录为/opt/crosstool,如下所示:sudomkdir /opt/crosstoolsudochown $USER /opt/crosstoolC. 修改针对目标板的脚本文件。
$sudovi demo-arm.sh(1)这几个环境变量可以根据实际情况修改TARBALLS_DIR=$HOME/downloadsRESULT_TOP=/opt/crosstoolexport TARBALLS_DIR RESULT_TOPGCC_LANGUAGES="c,c++"export GCC_LANGUAGES(2)在若干行eval语句中选择要建立的交叉编译链的组合,去掉该行eval的#号。
例如要做gcc为3.3.3,glibc为2.3.2的工具链eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notestD. 修改目标板脚本文件demo-arm.sh中eval那一行出现的体系结构的配置文件$sudovi arm.datKERNELCONFIG=`pwd`/arm.configTARGET=arm-unknown-linux-gnuTARGET_CFLAGS="-O"可以修改TARGET变量为TARGET=arm-S3C2410-linux-gnu(你的arm型号)E.修改目标板脚本文件demo-arm.sh中eval那一行出现的工具链的匹配文件$sudovi gcc-3.4.5-glibc-2.3.6.datBINUTILS_DIR=binutils-2.15GCC_DIR=gcc-3.3.3GLIBC_DIR=glibc-2.3.2LINUX_DIR=linux-2.4.26GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2以上变量要根据实际情况修改。
交叉编译链接
交叉编译指的是在一个平台上生成另一个平台上的可执行代码,但编译平台本身不能运行该程序。
例如,在x86平台上编写程序并编译成能在ARM平台上运行的可执行代码,编译得到的程序在x86平台上不能运行,必须放到ARM平台上才能运行。
交叉编译工具链的命名一般遵循target-platform-triplet的格式,例如arm-linux-gcc表示用于生成ARM平台上Linux系统下运行的程序的GCC编译器。
交叉编译的环境配置包括安装交叉编译工具链和配置环境变量等步骤。
例如,在Linux上使用arm-linux-gcc编译器进行交叉编译时,需要将工具链的路径添加到环境变量中。
在交叉编译过程中,链接器的作用是将多个目标文件链接成一个可执行文件。
常用的链接器包括ld等。
总之,交叉编译是开发跨平台软件的重要技术之一,需要选择适合目标平台的交叉编译工具链,并正确配置环境变量和链接器等工具。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
原文链接与:/u1/58901/showart_1335004.html实验室的机器配置太低,速度太慢实在是受不了。
说是已经升级了,内存从128M升级到了256M。
My god!这年头还能到什么地方找那么多128的内存条去阿?哇嘎嘎。
真是服了。
哈哈打开一个pdf文件要等老半天。
基本上没有办法工作。
于是想在自己的笔记本上做一个交叉编译环境。
我的机器配置也不高,但是相对于实验室的机器来说已经相当不错了。
我的机器是单操作系统:只有Ubuntu8.0.4。
感觉和windows XP差不多。
XP下有的东西,ubuntu下基本上也有。
ps:昨天是我的生日。
昨天上午有课,一下午还有今天上午就是在交叉编译的过程中度过的。
感觉整个过程挺考验耐心的。
下面进入正题。
待续。
最近两天内补充完整。
*************************************************************************************在进行嵌入式在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开发环境。
本文结合自己做嵌入式交叉编译开发工作的经验,同时结合自己的体会,做了一个介绍随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来越多的进入人们的生活之中,应用范围越来越广。
在裁减和定制Linux,运用于你的嵌入式系统之前,由于一般嵌入式开发系统存储大小有限,通常你都要在你的强大的pc机上建立一个用于目标机的交叉编译环境。
这是一个由编译器、连接器和解释器组成的综合开发环境。
交叉编译工具主要由binutils、gcc 和glibc 几个部分组成。
有时出于减小libc 库大小的考虑,你也可以用别的c 库来代替glibc,例如uClibc、dietlibc 和newlib。
建立一个交叉编译工具链是一个相当复杂的过程,如果你不想自己经历复杂的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载。
交叉编译介绍•交叉编译就是在一个平台上生成另一个平台上的可执行代码。
•这里说的平台分别指的是主机平台Host和目标平台Target。
•就我们在ARM平台上移植Linux来说,Host是一台一般的PC机,它通过串口或网络接口与Target通信;Target是arm-linux平台(这里说的arm指的是平台所使用的CPU是ARM9处理器,linux指的是运行的操作系统是Linux)。
•我们在Host上开发程序,并在这个平台上运行交叉编译器Cross Complier,编译我们的程序,而由Cross Complier生成的程序将在Target上运行。
•目前常用的交叉开发环境主要有开放和商业两种类型。
–开放的交叉开发环境的典型代表是GNU工具链,目前已能够支持x86、ARM、PowerPC等多种处理器。
–商业的交叉开发环境主要有Metrowerks CodeWarrior、ARMSoftware Development Toolkit等。
常用在ARM平台的GNU Toolchain:• arm-linux-gcc:交叉编译linux内核• arm-elf-gcc:主要交叉编译uclinux内核• arm-uclinux-gcc:交叉编译uclinux内核主要下载网址(网址)•下载下来之后的几种安装方式:• sh脚本方式安装(.sh)– sh arm-elf-tools-20030314.sh• tar解压方式安装(.tar.gz)– tar zxvf arm-linux-gcc-2.95.3.tar.gz• rpm安装包方式安装(.rpm)– rpm –ivh arm-linux-gcc-2.95.3-3.i386.rpm– rpm –ivh arm-linux-binutils-2.12.1-1.i386.rpm– rpm –ivh arm-linux-glibc-2.2.5-1.i386.rpm•安装目录:/usr/local/bin/arm-elf-xxx/usr/local/arm-linux/bin/arm-linux-xxx/usr/local/arm-uclinux-tool/bin/arm-uclinux-xxx为了在命令行中能够寻找到交叉编译器,我们需要把他所在的路径加入到PATH环境变量中(例:/usr/local/arm/bin:$PATH )。
交叉编译环境的组成:• binutils工具包:包括连接器、汇编器以及其他用于目标文件和档案的工具,如as汇编器,ld连接器等。
• gcc工具包:工具链的主角,包括c编译器gcc、c++编译器g++等。
• glibc库:提供系统调用的基本函数的C库,比如,printf、open等。
• gdb调试工具:运行在target上的调试程序,通过串口和TCP/IP和主机连接,进行远距离调试。
需要交叉编译的原因:•首先,在项目的起始阶段,目标平台尚未建立,因此需要做交叉编译,以生成我们所需要的Bootloader以及kernel(因为Bootloader和kernel的源码需要经过交叉编译后才可以在目标平台上运行);•其次,当目标平台能启动之后,由于目标平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。
因此,建立交叉编译环境是进行嵌入式软件开发的第一步。
下面我们将以建立针对arm的交叉编译开发环境为例来说明整个交叉编译器DIY的过程,其他的体系结构与这个相类似,只要作一些对应的改动。
我的开发环境是,宿主机i386-ubuntu-8.04,目标机arm。
因为Linux内核版本多,不同的版本存在不同的bug,加之众多版本的工具链也存在不同的bug,这些bug针对不同的硬件(比如CPU类型等),需要多方测试,寻找合适的补丁程序。
我是从网上看到大家都按如下的这个过程进行(我也是这么做的):1. 下载源文件、补丁和建立编译的目录2. 建立内核头文件3. 建立二进制工具(binutils)4. 建立初始编译器(bootstrap gcc)5. 建立c库(glibc)6. 建立全套编译器(full gcc)(一)下载源文件、补丁和建立编译的目录1. 选定软件版本号选择软件版本号时,先看看glibc源代码中的INSTALL文件。
那里列举了该版本的glibc编译时所需的binutils 和gcc的版本号。
例如在glibc-2.2.3/INSTALL 文件中推荐gcc 用2.95以上,binutils 用2.10.1 以上版本。
网上有推荐的如下比较稳定的而且出错比较少的几个版本组合如下,以下是已选定的构建交叉编译环境的工具链版本:– BINUTILS_VERSION=2.16– GCC_VERSION=3.4.3– GCCCORE_VERSION=3.4.3– LINUX_VERSION=2.4.21– GLIBC_VERSION=2.3.5– GLIBCTHREADS_VERSION=2.3.5我选的各个软件的版本也大致如此,其具体如下:binutils-2.10.1(ftp:///gnu/binutils/)gcc-2.95.3(ftp:///gnu/gcc/gcc-2.95.3)glibc-2.2.3(ftp:///gnu/glibc)glibc-linuxthreads-2.2.3(ftp:///gnu/glibc)linux-2.4.21-rmk2(/pub/linux/arm/kernel/v2.4/)linux-2.4.21.tar.gz(/pub/linux/kernel/v2.4/)gcc patch下载:/gcc-2.95.3.-2.patchgcc-2.95.3.-no-fixinc.patchgcc-2.95.3-returntype-fix.patc如果你选的glibc的版本号低于2.2,你还要下载一个叫glibc-crypt的文件,例如glibc-crypt-2.1.tar.gz。
Linux 内核你可以从 或它的镜像下载。
Binutils、gcc和glibc你可以从FSF的FTP站点ftp:///gnu/ 或它的镜像去下载。
在编译glibc时,要用到Linux 内核中的include 目录的内核头文件。
如果你发现有变量没有定义而导致编译失败,你就改变你的内核版本号。
例如我开始用linux-2.4.25+vrs2,编译glibc-2.2.3 时报BUS_ISA 没定义,后来发现在2.4.23 开始它的名字被改为CTL_BUS_ISA。
如果你没有完全的把握保证你改的内核改完全了,就不要动内核,而是把你的Linux 内核的版本号降低或升高,来适应glibc。
Gcc 的版本号,推荐用gcc-2.95 以上的。
太老的版本编译可能会出问题。
Gcc-2.95.3 是一个比较稳定的版本,也是内核开发人员推荐用的一个gcc 版本。
如果你发现无法编译过去,有可能是你选用的软件中有的加入了一些新的特性而其他所选软件不支持的原因,就相应降低该软件的版本号。
例如我开始用gcc-3.3.2,发现编译不过,报as、ld 等版本太老,我就把gcc 降为2.95.3。
太新的版本大多没经过大量的测试,建议不要选用。
(二)建立工作目录首先,我们建立几个用来工作的目录:在你的用户目录,我用的是用户tang,因此用户目录为/home/tang,先建立一个项目目录cross。
tang@tang-laptop:~$ pwd/home/tangtang@tang-laptop:~$ mkdir cross再在这个项目目录cross 下建立三个目录build-tools、kernel 和tools。
build-tools-用来存放你下载的binutils、gcc 和glibc 的源代码和用来编译这些源代码的目录。
kernel-用来存放你的内核源代码和内核补丁。
tools-用来存放编译好的交叉编译工具和库文件。
tang@tang-laptop:~$ cd crosstang@tang-laptop:~/cross$ mkdir build-tools kernel tools执行完后目录结构如下:tang@tang-laptop:~/cross$ ls ./build-tools kernel tools3. 输出和环境变量我们输出如下的环境变量方便我们编译。
tang@tang-laptop:~/cross$ export PRJROOT=home/tang/crosstang@tang-laptop:~/cross$ export TARGET=arm-linuxtang@tang-laptop:~/cross$ export PREFIX=$PRJROOT/toolstang@tang-laptop:~/cross$ export TARGET_PREFIX=$PREFIX/$TARGETtang@tang-laptop:~/cross$ export PATH=$PREFIX/bin:$PATH如果你不惯用环境变量的,你可以直接用绝对或相对路径。