建立针对WinCE的GCC-ARM交叉编译环境

开源社区提供了大量价值极高的代码,这些代码大部分是基于GNU C Compiler编译器的,学好GCC对我们学习使用开源代码有重要的作用。GCC是跨平台的优秀编译器,代码效率也比比较高。很多时候我们需要在项目中使用开源代码,但是将GCC的工程移植到Win32 NT还可以使用MinGW,如果要移植到WinCE下却比较麻烦,不仅是基础库的差异,GCC的内联汇编使用AT&T的汇编格式,一般程序员都很陌生,要改成ARMASM使用的汇编格式无疑是件生不如死的差事。如果能直接用GCC编译生成Wince可用的文件,或者是GCC与EVC或VS2005混合编译程序,将难以移植的部分交给GCC编译,来实现开源项目的移植,世界该有多美好^_^。GCC是跨平台且可定制的,对付WinCE当然不在话下。
首先确定你的系统上安装有必须的开发工具:binutils, gcc, make, bison, byacc, flex, perl,如果你用的是Cygwin还需要w32api,我就是用的Cygwin,所以一下所说是我在Cygwin的配置经过。安装完开发工具后我们要去下载几个新一些的程序包:binutils,gcc,推荐http://ftp.gnu.org/gnu/gcc/或ftp://sources.redhat.com/pub/binutils/snapshots/

交叉编译环境主要包括以下几个部分:
针对目标系统的编译器gcc,我下载的是gcc-core-3.4.4.tar.bz2和gcc-g++-3.4.4.tar.bz2,这两个代码包包含了GCC的核心一个C编译器和一个C++编译器。
针对目标系统的二进制工具binutils,我下载的是binutils-2.17.tar.gz,这个压缩包包含有ld,ar,as等一些产生或者处理二进制文件的工具,主要包括汇编编译器和连接器,还包括其他一些二进制代码工具。

将代码包解压到 /usr/src下
$tar -xzvf binutils-2.17.tar.gz
$tar -xjvf gcc-core-3.4.4.tar.bz2
$tar -xjvf gcc-g++-3.4.4.tar.bz2
下面进行最重要的一步 patch 代码包
需要修改/usr/src/gcc-3.4.4/gcc/config/arm/目录下的pe.h和wince-pe.h文件,我们可以直接修改代码,或者使用patch命令来更新。
在/usr/src下建立一个文本文件gcc-3.4.3.wince.diff输入一下内容并保存:
diff -urN orig-gcc-3.4.4/gcc/config/arm/pe.h gcc-3.4.4/gcc/config/arm/pe.h

--- orig-gcc-3.4.4/gcc/config/arm/pe.h 2004-02-24 15:25:22.000000000 +0100
+++ gcc-3.4.4/gcc/config/arm/pe.h 2005-04-05 12:40:43.171875000 +0200
@@ -84,11 +84,12 @@
 #define WCHAR_TYPE_SIZE 16

 /* r11 is fixed.  */
+/*
 #undef  SUBTARGET_CONDITIONAL_REGISTER_USAGE
 #define SUBTARGET_CONDITIONAL_REGISTER_USAGE /
   fixed_regs [11] = 1; /
   call_used_regs [11] = 1;
-
+*/

 /* Define this macro if in some cases global symbols from one translation
    unit may not be bound to undefined symbols in another translation unit
diff -urN orig-gcc-3.4.4/gcc/config/arm/wince-pe.h gcc-3.4.4/gcc/config/arm/wince-pe.h
--- orig-gcc-3.4.4/gcc/config/arm/wince-pe.h 2004-02-24 15:25:22.000000000 +0100
+++ gcc-3.4.4/gcc/config/arm/wince-pe.h 2005-04-05 12:41:07.281250000 +0200
@@ -22,7 +22,7 @@
 /* Override arm/pe.h's default apcs26 support.  */
 
 #undef  TARGET_DEFAULT
-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_SOFT_FLOAT | TARGET_FLAG_NOP_FUN | ARM_FLAG_MMU_TRAPS)
+#define TARGET_DEFAULT (ARM_FLAG_VFP | ARM_FLAG_APCS_32 | ARM_FLAG_SOFT_FLOAT | TARGET_FLAG_NOP_FUN | ARM_FLAG_MMU_TRAPS)
 
 #undef  MULTILIB_DEFAULTS
 #define MULTILIB_DEFAULTS /


执行cat gcc-3.4.4.wince.diff | patch -p0
接下来就是编译binutils和gcc了,方法很简单

$export PREFIX=/usr/arm-wince
$export TARGET=arm-wince-pe
$mkdir build-binutils-wince build-gcc-wince

$cd /usr/src/build-binutils-wince
$../binutils-x.xx/configure --target=$TARGET --prefix=$PREFIX --disable-nls
$make all install

$cd /usr/src/build-gcc-wince
$export PATH=$PATH:$PREFIX/bin
$../gcc-x.x.x/configure --target=$TARGET --prefix=$PREFIX --disable-nls /
    --enable-languages=c,c++ --without-headers --with-newlib
$make all-gcc install-gcc
最后你还需要吧c:/cygwin/bin 和c:/cygwin/usr/arm-wince/bin加入到系统的path里面,如果要和MS VS或EVC配合起来,需要把这个路径加入IDE的执行文件搜索目录,OK基于WinCE的Gcc编译器就建立好了。
但是这只是一个简单的WinCE编译连接器,还缺少必要的库文件和WinCE的SDK, 如何配置一个完善的基于GCC的Wince开发环境我还在摸索中,且听下回分解吧!

你可能感兴趣的:(汇编,gcc,编译器,WinCE,patch,translation)