基于ARM-linux的交叉编译环境的创建

时间:2022-07-24 07:26:05

基于ARM-linux的交叉编译环境的创建

摘要:嵌入式系统、嵌入式产品已经广泛地应用于国防、消费、信息家电、网络通信、工业控制等各个领域。本文以在linux系统上针对目标机ARM为例,介绍了跨平台的交叉编译的概念,并详细阐述了如何自己建立基于ARM-linux的交叉编译环境,为嵌入式产品的开发打下良好的基础。

关键词:嵌入式;ARM;Linux;交叉编译

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)15-30787-02

The Establishment of ARM-linux Based Cross-Compiler Environment

WANG Xiao-hui

(Huaiyin Institute of Technology Organization Department, Huaian 223001, China)

Abstract:Embedded system and products have been widely used in national defense, consumption, information appliances, network communications, industrial control and other fields. This article takes the target ARM on Linux system for example, and introduces the concept of cross-compiler on cross platforms. It also expatiates how to establish ARM-Linux based cross-compiler environment by yourself. Thus it makes a good base for the development of embedded products.

Key words: Embedded system; ARM; Linux; Cross-Compiler

1 引言

以嵌入式计算机为核心的嵌入式系统是继网络技术之后,又一个IT领域新的技术发展方向。由于嵌入式系统具有体积小、性能强、功耗低、可靠性高以及面向行业具体应用等突出特点,目前已经广泛地应用于国防、消费电子、信息家电、网络通信、工业控制等各个领域。例如,几乎所有的手机、移动设备、PDA几乎都是用具有ARM核的系统芯片开发的。

随着Linux大受欢迎,嵌入式Linux也得到程序员和嵌入式板生产商的注意,但是Linux毕竟是一个用于PC平台的普通操作系统,将它用于嵌入式系统还需要加工处理。

2 交叉编译基础知识

当我们开发嵌入式Linux软件时,一般都要经过交叉编译这一步。交叉编译环境,一般是一个由编译器、连接器和解释器组成的综合开发环境。交叉编译是嵌入式开发过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成,一般把前者称为目标机(target),后者称为宿主机(host)。目标机设备一般不具备一定的处理器能力和存储空间,即单独在目标板上无法完成程序的开发,所以只好求助于宿主机。在宿主机上编译好适合目标机运行的代码后,通过宿主机到目标机的调试通道将代码下载到目标机,然后由运行于宿主机的调试软件控制代码在目标机上运行调试。

对于交叉编译器,可以自己生成,也可以从网上下载(主要下载网址:)。区别在于从网上下载的非常简单方便,但很难找到适合自己所选择的平台。很显然,要交叉编译就得有一个特殊的“环境”作前提,这里的环境就是一个与PC机不同的一套库函数和编译器。用这样的库函数和编译器编译出来的应用程序就可以在嵌入式设备上运行了。

3 建立ARM交叉编译环境具体步骤

下面具体介绍如何在 linux 操作系统下建立自己的开发环境。首先设定我们需要的软件环境:PC机操作系统Linux RedHat9.0,Kernel version 2.4.20。基于linux RedHat9.0整个编译过程大体分为以下几个步骤:

3.1 创建编译环境

这个过程中,将设置一些环境变量,创建安装目录,安装linux内核源代码和头文件,取得Binutils、GCC、Glibc的源码,需要注意的是,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致。可以到相关网站去获得,网上这方面资源比较丰富。你把这三个文件解压到你自己创建的目录中就可以了。交叉编译使用的软件包如下表所示:

3.2 创建binutils(会创建arm-linux-ld等工具)

这个过程中会创建arm-linux-ld等工具。首先要安装的软件包是bunutils。这非常重要,因为Glibc和gcc会针对使用的连接器和汇编器进行多种测试,以决定打开某些特性。在配置Binutils之前先把Linux内核中GCC所必需的头文件拷到GCC可以找到的目录。如下操作:

cpCdr include/asm-arm/toolchain/gcc/arm-linux/include/asm

cpCdr include/linux/toolchain/gcc/arm-linux/include/linux

然后进入Binutils目录,首先运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,这里是toolchain/arm,使用--target=arm-linux参数指定目标机类型,然后执行make install。操作如下:

./configure--target=arm-linux--prefix=/toolchain/arm

make all install

这时$PREFIX/bin下创建了一些文件,包括arm-linux-ld,arm-linux-as等。

3.3 创建一个交叉编译版本的gcc

在开始之前,我们要弄清这样一个事实,创建交叉编译版本的gcc,需要交叉编译版本的glibc及头文件,而交叉编译版本的glibc是通过交叉编译版本的gcc创建的,面对这个问题,解决办法是先只编译对C语言的支持,并禁止支持线程。因此,这步只能编译C程序,而不能编译C++程序。

编译之前先修改gcc 的t-linux 文件,此文件放在gcc/config/arm目录下。在t-linux文件中的TARGET_LIBGCC2_CFLAGS后加上__gthr_posix_h inhibit_libc,操作如下:

进入gcc/config/arm目录

mv t-linuxt-linux-orig//备份原来的t-linux文件

修改如下:

sed's/TARGET_LIBGCC2_CFLAGS=/TARGET_LIBGCC2_CF

LAGS=-D_gthr_posix_h-Dinhibit_libc/'t-linux-core

cp ./t-linux-core ./t-linux

然后进入GCC安装目录进行编译,如下操作:(\是行连接符号)

./configure

--target=arm-linux

--prefix=/toolchain/gcc

--enable-languages=c

--with-local-prefix=/toolchain/gcc/arm-linux

--without-headers \(\\不编译头文件)

--with-newlib

--disable-shared

make all install

这里首先生成的是C编译器,只能支持C语言,经过此编译过程内,将产生arm-linux-gcc等文件。

3.4 创建一个交叉编译版本的glibc(即glibcheader)

glibc是一个提供系统调用和基本函数的C语言库,比如open,malloc和printf等,所有动态链接的程序都要用到它。创建glibc需要的时间更长。编译Glibc之前我们先要把编译器改为我们刚刚生成的交叉编译器arm-linux-gcc,同时要指定编译所需要的头文件。操作如下:

CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib

然后进入Glibc的安装目录,进行配置如下:

./configure

--host=arm-linux

--prefix=/toolchain/gcc/arm-linux

--enable-add-ons

--with-headers=/toolchain/gcc /arm-linux/include

make all install

host=arm-linux说明此链接库将在目标板上执行。

3.5 编译完整的gcc(可以编译C++程序)

编译交叉编译版本的GCC,需要有交叉编译版本的 glibc的支持,通过前面的工作已经获得了glibc和头文件,为创建完整版本的gcc打下基础。

恢复t-linux 文件

用备份的t-linux-orig 覆盖改动后的t-linux

cp /toolchian/gcc/config/arm/t-linux-orig/toolchian/gcc/config/arm/t-linux

重新编译

./configure

--target=arm-linux

--prefix=/toolchian/gcc

--enable-languages=c,c++

--with-local-prefix=/toolchian/gcc /arm-linux

make all install

到此为止,我们的交叉编译环境就已经完成好了。如果在交叉编译中出现错误,那么请检查:

(1)版本选择是否正确,以及是否安装了相应的补丁;(2)库文件路径设置是否正确;(3)系统环境变量是否设置正确。

4 结束语

整个跨平台开发工具链都已设置好,可以直接在PC平台上编写、编译和链接基于ARM的程序。

参考文献:

[1]尤盈盈, 孟利民. 构建嵌入式linux交叉编译环境[J]. 计算机与数字工程, 2006(6) .

[2]王田苗. 嵌入式系统设计与实例开发[M]. 北京:清华大学出版社, 2003.10.

[3]郭秋平. 基于ARM系统的Linux平台移植研究[M]. 浙江大学, 2006.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

上一篇:医药类院校《数据库原理与应用》实验教学模式... 下一篇:Java的多线程机制在Socket编程中的应用