努力工作,建立一个幸福的家庭。
分类: LINUX
2010-05-16 18:31:07
一、准备文件
我的电脑是装的Ubuntu 9.10 Linux,不是虚拟机。想建立交叉编译环境,首先你的电脑中得有编译环境,就是那些常见的,例如GCC等。这个我就不写了,网上也是多得是,太常见了。
然后,我们要下载建立所需要的文件。这是列表:
源代码文件及其版本与下载地址:
binutils-2.19.1.tar.bz2
glibc-2.11.tar.bz2
binutils-2.19.1-branch_update-1.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/*二进制文件
建立好了目录之后,将各个源代码文件放入对应的文件夹中,这时../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中应该有
紧接着,解压缩各个文件,对应打好补丁。然后,将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
然后在终端执行
$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
$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 ?
错误见:《建立交叉编译错误集》