
移植linux交叉环境.doc
18页移植移植 linuxlinux 交叉环境交叉环境http://ftp.gnu.org/pub/gnu/ 建立 arm-linux 交叉编译环境 2006-10-02 23:33 整个过程如下1. 下载源文件、补丁和建立编译的目录2. 建立内核头文件3. 建立二进制工具(binutils)4. 建立初始编译器(bootstrap gcc)5. 建立 c 库(glibc)6. 建立全套编译器(full gcc)1.下载源文件、补丁和建立编译的目录1.1. 选定软件版本号选择软件版本号时,先看看 glibc 源代码中的 INSTALL 文件那里列举了该版本的 glibc 编译时所需的 binutils 和 gcc 的版本号例如在 glibc-2.2.3/INSTALL 文件中推荐 gcc 用 2.95 以上,binutils 用 2.10.1 以上版本我选的各个软件的版本是:linux-2.4.18+rmk7 (linux-2.6.0+rmk1)binutils-2.11gcc-2.95.3glibc-2.2.3glibc-linuxthreads-2.2.3gdb-6.0如果你选的 glibc 的版本号低于 2.2,你还要下载一个叫 glibc-crypt 的文件,例如 glibc-crypt-2.1.tar.gz。
Linux 内核你可以从 www.kernel.org 或它的镜像下载Binutils、 gcc 和 glibc 你可以从 FSF 的 FTP 站点http://ftp.gnu.org/pub/gnu/ 或它的镜像去下载在编译 glibc时,要用到 Linux 内核中的 include 目录的内核头文件如果你发现有变量没有定义而导致编译失败,你就改变你的内核版本号例如我开始用 linux-2.4.25+vrs2,编译 glibc -2.2.3 时报 BUS_ISA 没定义,后来发现在 2.4.23 开始它的名字被改为 CTL_BUS_ISA如果你没有完全的把握保证你改的内核改完全了,就不要动内核,而是把你的 Linux 内核的版本号降低或升高,来适应 glibcGcc 的版本号,推荐用 gcc-2.95 以上的太老的版本编译可能会出问题Gcc-2.95.3 是一个比较稳定的版本,也是内核开发人员推荐用的一个 gcc 版本如果你发现无法编译过去,有可能是你选用的软件中有的加入了一些新的特性而其他所选软件不支持的原因,就相应降低该软件的版本号例如我开始用 gcc-3.3.2,发现编译不过,报 as、ld 等版本太老,我就把 gcc 降为 2.95.3。
太新的版本大多没经过大量的测试,建议不要选用1.2. 建立工作目录首先,我们建立几个用来工作的目录:在你的用户目录,我用的是用户 cxli,因此用户目录为 /home/cxli,先建立一个项目目录 CrossProjpwd/home/cxli$mkdir CrossProj再在这个项目目录 embedded 下建立三个目录 build-tools、kernel 和 toolsbuild-tools-用来存放你下载的 binutils、gcc 和 glibc 的源代码和用来编译这些源代码的目录kernel-用来存放你的内核源代码和内核补丁tools-用来存放编译好的交叉编译工具和库文件cd CrossProj$mkdir build-tools kernel tools$cd tools$mkdir arm-linux执行完后目录结构如下:$ls CrossProjbuild-tools kernel tools1.3. 输出和环境变量我们输出如下的环境变量方便我们编译export PRJROOT=/home/cxli/CrossProj$export TARGET=arm-linux$export PREFIX=$PRJROOT/tools$export TARGET_PREFIX=$PREFIX/$TARGET$export PATH=$PREFIX/bin:$PATH如果你不惯用环境变量的,你可以直接用绝对或相对路径。
我如果不用环境变量,一般都用绝对路径,相对路径有时会失败环境变量也可以定义在.bashrc 文件中,这样当你 logout 或换了控制台时,就不用老是 export 这些变量了网上还有一些 HOWTO 可以参考,ARM 体系结构的《The GNU Toolchain for ARM Target HOWTO》 ,PowerPC 体系结构的《Linux for PowerPC Embedded Systems HOWTO》等对 TARGET 的选取可能有帮助1.4. 建立编译目录为了把源码和编译时生成的文件分开,一般的编译工作不在的源码目录中,要另建一个目录来专门用于编译用以下的命令来建立编译你下载的 binutils、gcc 和 glibc 的源代码的目录cd $PRJROOT/build-tools$mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patchbuild-binutils-编译 binutils 的目录build-boot-gcc-编译 gcc 启动部分的目录build-glibc-编译 glibc 的目录build-gcc-编译 gcc 全部的目录gcc-patch-放 gcc 的补丁的目录gcc-2.95.3 的补丁有 gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch 和 gcc-2.95.3-returntype-fix.patch,可以从 http://www.linuxfromscratch.org/ 下载到这些补丁。
(可以不需要这些补丁)再将你下载的 binutils-2.11、gcc-2.95.3、glibc-2.2.3 和 glibc-linuxthreads-2.2.3 的源代码放入 build-tools 目录中看一下你的 build-tools 目录,有以下内容:$lsbinutils-2.11.tar.bz2 build-gcc gcc-patchbuild-binutils build-glibc glibc-2.2.3.tar.gzbuild-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz2.建立内核头文件把你从 www.kernel.org 下载的内核源代码放入 $PRJROOT /kernel 目录进入你的 kernel 目录:$cd $PRJROOT /kernel解开内核源代码$tar -xzvf linux-2.4.18.tar.gzor $tar -xjvf linux-2.4.18.tar.bz2小于 2.4.19 的内核版本解开会生成一个 linux 目录,没带版本号,就将其改名mv linux linux-2.4.x给 Linux 内核打上你的补丁$cd linux-2.4.18$patch -p1 gcc/cstamp-h.in (不打补丁也可以)在我们编译并安装 gcc 前,我们先要改一个文件 $PRJROOT/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-2.95.3/gcc/libgcc2.c:41: stdlib.h: No such file or directory../../gcc-2.95.3/gcc/libgcc2.c:42: unistd.h: No such file or directorymake[3]: *** [libgcc2.a] Error 1make[2]: *** [stmp-multilib-sub] Error 2make[1]: *** [stmp-multilib] Error 1make: *** [all-gcc] Error 2如果没有定义 -D__gthr_posix_h,编译时会报如下的错误In file included from gthr-default.h:1,from ../../gcc-2.95.3/gcc/gthr.h:98,from ../../gcc-2.95.3/gcc/libgcc2.c:3034:../../gcc-2.95.3/gcc/gthr-posix.h:37: pthread.h: No such file or directorymake[3]: *** [libgcc2.a] Error 1make[2]: *** [stmp-multilib-sub] Error 2make[1]: *** [stmp-multilib] Error 1make: *** [all-gcc] Error 2还有一种与-Dinhibit 同等效果的方法,那就是在你配置 configure时多加一个参数-with-newlib(不使用 glibc) ,这个选项不会迫使我们必须使用 newlib。
我们编译了 bootstrap-gcc 后,仍然可以选择任何 c 库接着就是配置 boostrap gcc, 后面要用 bootstrap gcc 来编译 glibc 库cd ..; cd build-boot-gcc$../gcc-2.95.3/configure –target=$TARGET –prefix=$PREFIX –without-headers –enable-languages=c –disable-threads这条命令中的 -target、–prefix 和配置 binutils 的含义是相同的,–without-headers 就是指不需要头文件,因为是交叉编译工具,不需要本机上的头文件enable-languages=c 是指我们的 boot-gcc 只支持 c 语言–disable-threads 是去掉 thread 功能,这个功能需要 glibc 的支持接着我们编译并安装 boot-gcc$make all-gcc$make install-gcc (编译时 arm.c:530 行始终报错,gcc 打了补丁也不管用,不知道是不是 gcc4.0 版本太高的原因)我们来看看 $PREFIX/bin 里面多了哪些东西$ls $PREFIX/bin你会发现多了 arm-linux-gcc 、arm-linux-unprotoize、cpp 和 gcov 几个文件。
Gcc - gnu 的 C 语言编译器Unprotoize - 将 ANSI C 的源码转化为 Kreturn 0;}$arm-linux-gcc helloworld.c -o helloworld$file helloworldhelloworld: ELF 32-bit LSB executable, ARM, version 1,dynamically linked (uses shared libs), not stripped上面的输出说明你编译了一个能在 arm 体系结构下运行的 helloworld,证明你的编译工具做成功了另外,现在也有编译好的 tool-chain 以供下载,可以访问ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain,参考 Wookey。
