一:准备
1、使用的软件版本
kernel:(http://www.kernel.org/pub/linux/kernel/v2.4/)
linux-2.4.21.tar.gz
(patch下载地址:ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.4/)
patch-2.4.21-rmk1.gz
binutils:(ftp://ftp.gnu.org/gnu/binutils)
binutils-2.14.tar.gz
gcc:(ftp://ftp.gnu.org/gnu/gcc)
gcc-core-2.95.3.tar.gz
gcc-g++-2.95.3.tar.gz
(patch下载地址:http://www.linuxfromscratch.org/patches/downloads/gcc/)
gcc-2.95.3-2.patch
gcc-2.95.3-no_fixinc-1.patch
gcc-2.95.3-returntype_fix-1.patch
glibc:(ftp://ftp.gnu.org/gnu/glibc)
glibc-2.2.4.tar.gz
glibc-linuxthreads-2.2.4.tar.gz
gdb:(ftp://ftp.gnu.org/gnu/gdb)
gdb-6.0.tar.bz2
二:建立工作目录
#cd /
#mkdir crosstool
#mkdir linux-2.4.21 binutils gcc glibc gdb
把下载的源代码的压缩文件放入对应的文件夹:
/crosstool/linux-2.4.21:linux-2.4.21.tar.gz、patch-2.4.21-rmk1.gz
/crosstool/binutils:
/crosstool/gcc:
/crosstool/glibc:
/crosstool/gdb:
三:建立二进制工具
#cd /crosstool/binutils
#tar -xvzf binutils-2.14.tar.gz
#cd binutils-2.14
#mkdir build-arm-linux
#../binutils-2.14/configure --target=arm-linux --prefix=/usr/local/arm/2.95.3
#make
#make install
--target 选项是指出交叉工具的体系结构,所有运行在主机上的交叉工具都要
配置这个选项。
--prefix 选项是指定路径前缀,编译完成之后,将安装到这个目录下。
要使用这些工具,我们必须在 linux 的启动脚本中添加如下环境变量:
#vi /etc/profile
在 profile 文件中添加如下 PATH 环境变量:
pathmunge /usr/local/arm/2.95.3/bin
保存。
使用source /etc/profile使修改生效。
四:建立gcc编译器(初始编译器)
#cd /crosstool/gcc
#tar -xvzf gcc-core-2.95.3.tar.gz
#tar –xvzf gcc-g++-2.95.3.tar.gz
#cd gcc-2.95.3
#patch -p1< ../gcc-2.95.3-2.patch
#patch -p1< ../gcc-2.95.3-no_fixinc-1.patch
#patch -p1< ../gcc-2.95.3-returntype_fix-1.patch
配置 t-linux 文件。因为我们现在还没有 glibc 库的支持,所以需要简单配置一些简单的选项。对于arm-linux 工具可以通过修改
/crosstool/gcc/gcc-2.95.3/gcc/config/arm/t-linux 配置文件。
编辑 t-linux 文件,在文件末尾加入如下 2 行:
#vim /crosstool/gcc/gcc-2.95.3/gcc/config/arm/t-linux
TARGET_LIBGCC2-CFLAGS += -Dinhibit_libc -D__gthr_posix_h
T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h
-Dinhibit_libc 的意思是禁止使用 libc,因为现在还没有编译出 glibc 库。
#mkdir build-arm-linux
#cd build-arm-linux
#../configure --target=arm-linux --prefix=/usr/local/arm/2.95.3 --with-headers=/crosstool/linux-2.4.21/linux-2.4.21/include --disable-shared –disable-threads –enable-languages="c"
该编译命令中:
--target 指定交叉编译工具的目标体系结构是 arm-linux
--prefix 指定安装路径为/usr/local/arm/2.95.3
--with-headers 指定内核头文件所在的路径为:/crosstool/linux-2.4.21/linux-2.4.21/include
--disable-shared 选项指定不使用共享库,这样就不依赖 glibc 了
--disable-threads 选项指定不使用线程,也就不使用线程库了。
--enable-languages 指定仅支持 c 语言
#make
在make的时候出现错误,在/crosstool/gcc/gcc-2.95.3/gcc/config/arm目录下的arm.c文件中,“arm_prog_mode = TARGET_APCS_32 ? PROG_MODE_PROG32 : PROG_MODE_PROG26;”句报错。可以将其注销。可以正常编译。
#make install
五:生成glibc库
#cd /crosstool/glibc
#tar -xvzf glibc-2.2.4.tar.gz
#cd glibc-2.2.4
#tar -xzvf ../glibc-linuxthreads-2.2.4.tar.gz
#mkdir build-arm-linux
#cd build-arm-linux
#CC=arm-linux-gcc AS=arm-linux-as LD=arm-linux-ld ../configure --host=arm-linux --with-headers=/crosstool/linux-2.4.21/linux-2.4.21/include/ --enable-add-ons=linuxthreads –enable-shared --prefix=/usr/local/arm/2.95.3/arm-linux
CC=arm-linux-gcc 是把 CC 变量设成你刚编译生成的 arm-linux-gcc,用它来编译你的glibc。
--host 指定目标板的体系结构
--with-headers 指定内核头文件的路径为/crosstool/linux-2.4.21/linux-2.4.21/include
--enable-add-ons=linuxthreads 支持线程库。
--enable-shared 选项支持共享库
--prefix 指定工具链目标板相关文件的目录
#make
#make install
此时在/usr/local/arm/2.95.3/arm-linux 目录下的 lib 等目录中,安装了 glibc共享库等文件。然后修改/usr/local/arm/2.95.3/arm-linux/lib/目录下的libc.so文件:
#vim /usr/local/arm/2.95.3/arm-linux/lib/libc.so
将“GROUP ( /usr/local/arm/2.95.3/arm-linux//lib/libc.so.6 /usr/local/arm/2.95.3/arm-linux//lib/libc_nonshared.a )”
修改为
“GROUP ( libc.so.6 libc_nonshared.a )”
这样连接程序 ld 就会在 libc.so 所在的目录查找它需要的库,因为你的机子的/lib 目录可能已经装了一个相同名字的库,一个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的。
如果不这样修改,会在后面第六步建立g++编译器的时候报错。(/crosstool/gcc/gcc-2.95.3/build-arm-linux/arm-linux/libiberty目录下找不到Makefile文件。)
出现编译错误问题。
六:建立全套编译器(gcc和g++)
#cd /crosstool/gcc/gcc-2.95.3
首先,将我们添加的2行-Dinhibit_libc去掉,因为此时不需要禁止使用libc了,我们在第 5 步中已经生成了libc。
#vim gcc/cpmfog/arm/t-linux
然后,进入 build-arm-linux 清除临时目录及临时文件。
#cd build-arm-linux
#make distclean
#rm –rf ./*
#../configure –target=arm-linux --prefix=/usr/loacal/arm/2.95.3 --with-headers=/crosstool/linux-2.4.21/linux2.4.21/include --enable-threads=pthreads --enable-shared --enable-static --enable-languages="c,c++"
#make
#make install
最后在/usr/loacal/arm/2.95.3/bin目录多了arm-linux-g++ 、arm-linux-protoize 和 arm-linux-c++几个文件
七:验证交叉编译工具
#cd /crosstool/
#mkdir test
#cd test
#vim helloworld.c
#include
int main(void)
{
}
#arm-linux-gcc helloworld.c -o helloworld
#file helloworld
helloworld: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.0.0, not stripped
表示编译了一个能在 arm 体系结构下运行的helloworld程序,说明编译工具做成功了。
八:其它制作交叉编译环境的方法
[test@localhost ~]$ echo $HOME
/home/test
[test@localhost ~]$ pwd
/home/test
[test@localhost ~]$
可见,当前用户为test,当前所在目录为/home/test。
[test@localhost ~]$ mkdir download crosstool-4.1.1
[test@localhost ~]$
创建download 和 crosstool-4.1.1文件夹;然后将下载好的源代码放置到download文件夹中。
[test@localhost ~]$ tar -zxvf crosstool-0.43.tar.gz
[test@localhost ~]$ cd crosstool-0.43
[test@localhost crosstool-0.43]$
解压crosstool-0.43,然后进入crosstool-0.43目录。
[test@localhost crosstool-0.43]$ vim demo-arm.sh
*********************************************
#!/bin/sh
# This script has one line for each known working toolchain
# for this architecture.
# Generated by generate-demo.pl from buildlogs/all.dats.txt
set -ex
#TARBALLS_DIR=$HOME/downloads
TARBALLS_DIR=/home/test/downloads
#RESULT_TOP=/opt/crosstool
RESULT_TOP=/home/test/crosstool-4.1.1
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES
............
#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest
eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest
echo Done.
*********************************************
修改TARBALLS_DIR和RESULT_TOP的值,同时添加语句“eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest”。
TARBALLS_DIR:是下载的工具源码压缩包的存放目录。
RESULT_TOP
[test@localhost crosstool-0.43]$ vim gcc-4.1.1-glibc-2.3.2.dat
*********************************************
BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.1
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.25
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5
*********************************************
将“LINUX_DIR=LINUX_DIR=linux-2.6.15.4”修改为“LINUX_DIR=LINUX_DIR=linux-2.6.25”;
[test@localhost crosstool-0.43]$ vim arm.dat
*********************************************
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux
TARGET_CFLAGS="-O"
*********************************************
将“TARGET=arm-unknown-linux-gnu”修改为“TARGET=arm-linux”
[test@localhost crosstool-0.43]$ ./demo-arm.sh
执行编译操作。生成的工具链在如下的位置:/home/test/crosstool-4.1.1/gcc-4.1.1-glibc-2.3.2,也就是我们刚才建立的crosstool-4.1.1文件夹中。
九:后记
那些组合可以编译成功,可以参考:http://kegel.com/crosstool/crosstool-0.43/buildlogs/表格
上一篇:关于arm-linux-gcc的安装与配置
下一篇:Keil C51 与 ARM 并存方法
推荐阅读最新更新时间:2024-03-16 14:49