Chinaunix首页 | 论坛 | 博客
  • 博客访问: 436538
  • 博文数量: 111
  • 博客积分: 4290
  • 博客等级: 上校
  • 技术积分: 1301
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 14:22
个人简介

努力工作,建立一个幸福的家庭。

文章分类

全部博文(111)

文章存档

2015年(4)

2013年(9)

2012年(6)

2011年(17)

2010年(69)

2009年(6)

分类: LINUX

2010-05-16 18:31:07

一、准备文件

我的电脑是装的Ubuntu 9.10 Linux,不是虚拟机。想建立交叉编译环境,首先你的电脑中得有编译环境,就是那些常见的,例如GCC等。这个我就不写了,网上也是多得是,太常见了。

然后,我们要下载建立所需要的文件。这是列表:

源代码文件及其版本与下载地址:

binutils-2.19.1.tar.bz2      
    gcc-4.3.3.tar.bz2            

glibc-2.11.tar.bz2           
    glibc-ports-2.11.tar.bz2     
    gmp-4.2.4.tar.bz2            
    linux-2.6.30.1.tar.bz2       
    mpfr-2.4.1.tar.bz2           
    补丁包版本及其下载地址:

binutils-2.19.1-branch_update-1.patch


    binutils-2.19.1-posix-1.patch

           
    gcc-4.3.3-branch_update-5.patch


    gcc-4.3.3-posix-1.patch


    gcc_eh.patch.cross


    mpfr-2.4.1-branch_update-1.patch


    mpfr-2.4.1-branch_update-2.patch

注:1.对于版本的要求:刚开始时很多人都会选用各个源代码最新的版本,其实没必要,也不好。其一,你的板子不一定支持这么新的源代码;其二,因为新的版 本中会加入新的东西,当你按着原先的方法进行编译时会出错误,而你又不知道错误在哪,这是很麻烦的,我就吃了这方面的亏,所以当你是新人时,尽量选择网上 成功例子的版本,这样会出错的概率会小一些。当然,如说你是高手或者对Linux下各个源代码的编译过程有所了解,那就例外了。

2.打补丁的方法:打补丁的方法很简单,首先进入你想要打补丁的文件夹,然后执行patch -p1 < path\to\your patch document(就是你的补丁文件的路径,还要注意“<”前后是有空格的),例如:

$cd binutils-2.19.1

$patch -p1 < /home/dengwei/../binutils-2.19.1-branch_update-1.patch  

如果你想详细了解请看:

然后我们开始要建立文件目录:(下面是到我的目录)

/home/dengwei/cross/build-tools/--binutils/*二进制文件

                             | --gcc/*编译器

                             --glibc/*C库文件

                  |--kernel /*存放内核的目录

                  |--Cross-Compile /*工具安装目录

建立好了目录之后,将各个源代码文件放入对应的文件夹中,这时../Build/binutils中应该有binutils- 2.19.1.tar.bz2,binutils-2.19.1-branch_update-1.patch,binutils-2.19.1- posix-1.patch。/Build/gcc中应该有 gcc- 4.3.3.tar.bz2,gmp-4.2.4.tar.bz2 ,mpfr-2.4.1.tar.bz2,gcc-4.3.3-branch_update-5.patch,gcc-4.3.3-posix- 1.patch,mpfr-2.4.1-branch_update-1.patch,mpfr-2.4.1-branch_update- 2.patch。Build/glibc中应该有glibc-2.11.tar.bz2,glibc-ports- 2.11.tar.bz2,gcc_eh.patch.cross。Linux-Kernel中应该有linux-2.6.30.1.tar.bz2

紧接着,解压缩各个文件,对应打好补丁。然后,将gmp-4.2.4改名gmp和mpfr-2.4.1改名mpfr放入gcc-4.3.3文件夹中。将glibc-ports-2.11改名为ports放入glibc-2.11中。

对于Ubuntu的用户,有一工具叫做mawk,我不知道是干什么用的,但是对于建立交叉编译环境是不利的,要换成gawk,具体方法可以google。

到目前为止,文件准备工作已全部完毕。

二、建立二进制工具(binutils)

建立环境变量:

$vim ~/.bashrc 在最先面加入如下的代码:

export PRJROOT=/home/Yourname/ARM

export PREFIX=$PRJROOT/Cross-Compile
   export $TARGET=arm-linux
   export PATH=$PREFIX/tools/bin:$PATH
   export host=i486-cross-linux-gnu

然后在终端执行

$cd /home/dengwei/cross/build-tools/binutils

$mkdir b

$cd b

$AR=ar AS=as

../binutils-2.19.1/configure \

--build=i486-cross-linux-gnu \

--host=i486-cross-linux-gnu \

--target=$TARGET \

--prefix=$PREFIX/tools \

--with-sysroot=$PREFIX \

--disable-nls --enable-shared --disable-multilib  --disable-werror注意:“\”不能省且前有空格

$make all

$make install

看一下$PREFIX/tools/bin 下的生成的文件都是用来干什么的

add2line - 将你要找的地址转成文件和行号,它要使用 debug 信息。

Ar-产生、修改和解开一个存档文件

As-gnu 的汇编器C++filt-C++ 和 java 中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标号,c++filt 就是实现这种反向的转化,根据标号得到函数名。

Gasp-gnu 汇编器预编译器。

Ld-gnu 的连接器Nm-列出目标文件的符号和对应的地址Objcopy-将某种格式的目标文件转化成另外格式的目标文件Objdump-显示目标文件的信息

Ranlib-为一个存档文件产生一个索引,并将这个索引存入存档文件中

Readelf-显示 elf 格式的目标文件的信息

Size-显示目标文件各个节的大小和目标文件的大小

Strings-打印出目标文件中可以打印的字符串,有个默认的长度,为4

Strip-剥掉目标文件的所有的符号信息

四、建立内核头文件(Linux Kernel)

#install the linux kernel headers
    cd /home/dengwei/arm_2010/cross/kernel/linux-2.6.30.1
    mkdir -p $PREFIX/usr/include
    make mrproper
    make ARCH=arm headers_check
    make ARCH=arm INSTALL_HDR_PATH=dest headers_install
    cp -rv dest/include/* $PREFIX/usr/include
    find $PREFIX/usr/include -name .install -or -name ..install.cmd |   xargs rm -fv

五、建立初始编译器(bootstrap gcc)

#Build gcc the first time
   cd/home/dengwei/arm_2010/cross/build-tools/gcc
mkdir g
cd g
AR=ar LDFLAGS="-Wl,-rpath,$PREFIX/lib" \
../../gcc-4.3.3/configure \
--build=$host \
--host=$host \
--target=$target \
--prefix=$PREFIX/tools \
--enable-languages=c \
--disable-nls \
--disable-shared \
--disable-threads \
--disable-libmudflap \
--disable-libssp \
--disable-libgomp \
--disable-decimal-float \
--without-headers --with-newlib \
--with-sysroot=$PREFIX
make
make install

我们来看看 $PREFIX/bin 里面多了哪些东西,你会发现多了 arm-linux-gcc 、arm-linux-unprotoize、cpp 和 gcov 几个文件。

Gcc-gnu 的 C 语言编译器

Unprotoize-将 ANSI C 的源码转化为 K&R C 的形式,去掉函数原型中的参数类型。

Cpp-gnu的 C 的预编译器

    Gcov-gcc 的辅助测试工具,可以用它来分析和优程序

六、建立 c 库(glibc) 


$cd  /home/dengwei/arm_2010/cross/build-tools/glibc

$mkdir g

$cd g

$echo "libc_cv_forced_unwind=yes" > config.cache

$echo "libc_cv_c_cleanup=yes" >> config.cache

$echo "libc_cv_arm_tls=yes" >> config.cache

$BUILD_CC="gcc" CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib

../glibc/glibc-2.11/configure \

--build=i486-cross-linux-gnu \

--host=arm-linux \

--target=arm-linux \

--prefix=$PREFIX/usr \

--with-tls --disable-profile --enable-add-ons \

--enable-kernel=2.6.0 --with-__thread \

--with-binutils=$PREFIX/tools/bin \

--with-headers=$PREFIX/usr/include \

--cache-file=config.cache

$make all

$make install

然后你还要修改 libc.so 文件,将GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)改为
GROUP ( libc.so.6 libc_nonshared.a)这样连接程序 ld 就会在 libc.so 所在的目录查找它需要的库,因为你的机子的/lib目录可能已经装了一个相同名字的库,一个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的。

七、建立全套编译器(full gcc)

在建立boot-gcc 的时候,我们只支持了C。到这里,我们就要建立全套编译器,来支持C和C++。

$cd /home/dengwei/arm_2010/cross/build-tools/gcc

$mkdir g1

$cd g1

$../gcc/gcc-4.3.3/configure \

--build=i486-cross-linux-gnu \

--host=i486-cross-linux-gnu \

--target=arm-linux \

--prefix=$PREFIX/tools \

--enable-languages=c,c++ --enable-c99 \

--enable-threads=posix --enable-long-long --enable-shared \

--enable-__cxa_atexit --disable-multilib --disable-nls --disable-libgomp \

--with-sysroot=$PREFIX

$make

$make install

我们再来看看 $PREFIX/bin 里面多了哪些东西。你会发现多了 arm-linux-g++ 、arm-linux-protoize 和 arm-linux-c++ 几个文件。

G++-gnu的 c++ 编译器。

Protoize-与Unprotoize相反,将K&R C的源码转化为ANSI C的形式,函数原型中加入参数类型。

C++-gnu 的 c++ 编译器。

至此,整个交叉编译环境就建立完成了.

--------------------------------------------------------------------

悲剧:最后一步出现了错误,who can give me a hand ?

错误见:《建立交叉编译错误集》

==================================================================================
参考:http://blog.chinaunix.net/u2/60303/showart_2159276.html
     http://blog.sina.com.cn/s/blog_44543ce90100h6ya.html
==================================================================================
阅读(1594) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~